指定在命令行参数中使用的Java接口实现

时间:2014-04-21 22:18:27

标签: java interface command-line-arguments classname

假设我有一个Java接口Blender.java,其中包含各种实现Cuisinart.javaOster.javaBlendtec.java等等。现在我想写一个这样的程序:

public class Blendifier {
    // ...
    public static void main(String... args) {
        Blender blender = new Cuisinart();
        blender.blend();
    }
}

但是现在如果我想使用Blendtec而不是Cuisinart,我必须打开源代码,更改代码并重新编译。

相反,我希望能够在运行程序时指定要动态使用的Blender,方法是将我想要的类名称作为命令行参数。

但是,如何从包含类的 name 的String转到构建该类的实际实例

2 个答案:

答案 0 :(得分:1)

如果您不想解决Java反射问题,可以编写一个简单的静态工厂方法,该方法接受String并返回相应的对象。

public static Blender createBlender(String type){
    switch(type){
    case "Cuisinart": return new Cuisinart();
    case "Oster": return new Oster();
    //etc
    }
}

然后你只需将你的命令行参数传入它,你就可以拥有你需要的任何Blender。

唯一可能的设计问题是你必须为每个实现Blender的类输出一行,所以如果你以后添加更多类型,你必须更新该方法。

答案 1 :(得分:0)

您有几种方法可以实现这一目标:

e.g。 if-else构造

Blender blender = null;
if (args[0].equals("Cuisinart")) {
   blender = new Cuisinart();
} else if (...)

其中args [0]是您的第一个命令行参数。