如何根据Java中字符串的值返回方法中的不同类型?

Sir*_*use 6 java

我是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

  1. 您可以if一个接一个地使用多个语句.

  2. 您可以enum为您的语言创建特殊语言并在switch语句中使用它.

  3. 你可以使用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)

  • 就个人而言,我更喜欢枚举实现,因为它允许正确切换,不需要假设一个无参数构造函数.代码不需要太长:Parsers.valueOf(extension).getParser(); (4认同)

Bil*_*ard 8

这称为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)