我是Java的新手,我遇到了以下问题:
我创建了几个实现"Parser"接口的类.我有一个JavaParser,PythonParser,CParser,最后是一个TextParser.
我正在尝试编写一个方法,因此它将采用File或String(表示文件名)并返回给定文件扩展名的相应解析器.
这是我基本上试图做的一些伪代码:
public Parser getParser(String filename)
{
String extension = filename.substring(filename.lastIndexOf("."));
switch(extension)
{
case "py": return new PythonParser();
case "java": return new JavaParser();
case "c": return new CParser();
default: return new TextParser();
}
}
Run Code Online (Sandbox Code Playgroud)
总的来说,这是处理这种情况的正确方法吗?另外,我应该如何处理Java不允许切换字符串的事实?我应该使用字符串的.hashcode()值吗?
我觉得有一些设计模式或处理这个问题,但它让我望而却步.这是你怎么做的?
Rom*_*man 11
您可以if一个接一个地使用多个语句.
您可以enum为您的语言创建特殊语言并在switch语句中使用它.
你可以使用Map语言是键的地方,解析器的原型是值.
第三个选项看起来很有趣.代码如下所示:
return parsers.get(extention).newInstance();
Run Code Online (Sandbox Code Playgroud)
这是使用枚举的第二个选项的一个有点棘手的实现:
enum Language {
JAVA {
public Parser getParser () {
return new JavaParser ();
}},
PYTHON {
public Parser getParser () {
return new PythonParser ();
}},
TEXT {
public Parser getParser () {
return new TextParser ();
}};
public Parser getParser () {
return null;
}
public static Language getLanguage (String extention) {
try {
return valueOf (extention);
} catch (IllegalArgumentException e) {
return TEXT;
}
}
}
...
public Parser getParser(String filename) {
String extension = filename.substring(filename.lastIndexOf("."));
return Language.getLanguage (extension).getParser ();
}
Run Code Online (Sandbox Code Playgroud)
这称为Factory方法模式,它似乎是处理问题的一种非常好的方法.解决"Java不允许切换字符串"问题的一种方法是使用if... else语句.
if (extension.equals("py")) {
return new PythonParser();
}
else if(extension.equals("java")) {
return new JavaParser();
}
else ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |