java - 获取 Foo.java 的一种实现

标签 java interface enums

我有Foo.java,它是接口(interface)。

还有很多实现它的类。 Bar1.java、Bar2.java

我在前端有一个方法,如下所示:getBar(String bar)

我可以这样做:

if(bar.equals("Bar1")) {
    return new Bar1();
}

但是我可以以某种方式做到这一点吗,每次有新的东西实现 Foo.java ,那么我就不必使用新的 ELSE 语句来更新我的方法。

我认为每个实现都有唯一的 ID 或其他东西,每当我创建它时,我都会将其添加到 BarX.java 中。

有什么建议或想法吗?我想也许我可以使用enum或smthing或任何其他解决方案。

最佳答案

仅供引用:您当然意识到您不应该这样写:

if(bar == "Bar1") {
    return new Bar1();
}

你应该这样做:

if("Bar1".equals(bar)) {
    return new Bar1();
}

看起来你需要一个工厂(又名虚拟构造函数)。如果您的所有 Foo 实现者都有一个默认构造函数,您可以这样做:

public class FooFactory {

    public static Foo create(Class<Foo> clazz) {
        return clazz.newInstance();
    }

    public static Foo create(String className) {
        return create(Class.forName(className));
    }
}

有异常需要处理;我没有时间为你拼写它们。你应该明白这个想法。您需要做的就是编写一个新类,您的工厂就可以处理它。

如果还有其他构造函数,只需使用参数和附加调用来详细说明主题即可。这应该可以帮助您入门。

关于java - 获取 Foo.java 的一种实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12728430/

相关文章:

oop - 糟糕的 OO 设计问题 - 我需要 Java 中的一些通用功能,但不知道如何实现它

Java - 为什么不允许 Enum<E> 作为 Annotation 成员?

struct - Swift1.2 结构体初始化函数编译报错

java - 已排序数组的快速排序堆栈溢出(适用于其他数据集)

Java Batch(JSR-352) 和 session 上下文 CDI

java - 将文件夹中的所有文本文件组合成一个文件

c# - 为什么我不能在显式实现接口(interface)的类中调用方法?

java - 如何绕过 Java Web 服务客户端中的证书检查

c# - 防止两个接口(interface)之间的转换

c# - 需求变更 : Use database table instead of enums. 如何处理使用枚举值的现有记录?