如何在Java中从枚举中返回对象?

4

我有多个实现同一接口的类。所有这些类的对象都必须在主类中实例化。我试图以一种优雅的方式完成此操作(我考虑了枚举)。示例代码:

public interface Intr {
//some methods
}

public class C1 implements Intr {
// some implementations
}

public class C2 implements Intr {
// some implementations
}

...

public class Ck implements Intr {
// some implementations
}


public class MainClass {

enum ModulesEnum {
//Some code here to return objects of C1 to Ck
 FIRST {return new C1()},
 SECOND {return new C2()},
 ...
 KTH  {return new Ck()};
}

}

现在在上面的例子中,我希望能以一种优雅的方式获得C1到Ck类的新对象实例。或者如果有其他更好的机制取代枚举也将不胜感激。


不清楚,你想要实现什么? - Braj
1
使用工厂模式。 - Makoto
工厂模式是您在这里的最佳选择。类似于这样的 http://alvinalexander.com/java/java-factory-pattern-example - elbuild
我在https://dev59.com/kWHVa4cB1Zd3GeqPqtix看到了一些类似但不完全相同的东西。所以我认为这可以通过枚举实现。 - Siddharth
看起来你需要一些工厂模式。根据你想要如何创建这些对象,你可以使用工厂模式、工厂方法或抽象工厂模式。 - Pat
3个回答

9
enum ModulesEnum {

  FIRST(new C1()), SECOND(new C2()); // and so on

  private ModulesEnum(Intr intr) { this.obj = intr; }
  private Intr obj;

  public Intr getObj() { return obj; }

}

希望这可以帮到您。关键是要给每个枚举添加一个实现。如果想要访问对象,请使用getter。

ModulesEnum.FIRST.getObj();

如果你的Intr及其实现是包保护的,那么你可以使ModulesEnum公开以暴露这些实现。这样做可以每个实现只有一个实例,使它们成为单例而不需要明确使用该模式。
当然,如果你想要每个实现有多个实例,你也可以使用工厂

1
你需要的是工厂模式。是否使用Enum类作为工厂本身是另一个问题。你可以像这样做:
public enum Module {
    FIRST, SECOND, ..., KTH
}

public class ModuleFactory {
    public Intr createModule(Module module) {
        switch (module) {
            case FIRST:
                return new C1();
            case SECOND:
                return new C2();
            ...
            case KTH:
                return new Ck();
            ...
        }
    }
}

如果不知道您打算如何使用这些对象,我无法确定哪种方法更合适。


我正在构建一个测试用例生成器。它有各种模块,如随机数生成器、随机字符串生成器、随机日期生成器等。将来会添加更多的模块。所有这些都通过一个主类进行管理。现在我的观点是,每当我向软件中添加一个新模块时,主类中应该改变最少量的代码。为此,我需要这个。 - Siddharth
如果你想要实现最小化的更改,你可能需要考虑采用监听者/观察者的方法。你可以创建一个 "ModuleRegistry" 模块注册表,然后对于每个需要添加到其中的新类,只需定位 "ModuleRegistry"(通过注入、静态方法、构造函数等方式),每个类就会自动注册。"ModuleRegistry" 将维护一个映射表。 - aberrant80

0
使用静态工厂。
public IntrFactory {

    static Intr first() {
        return new C1();
    }

    static Intr second() {
        return new C2();
    }

    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接