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

时间:2014-07-25 05:55:05

标签: java object enums

我有很多实现相同接口的类。所有这些类的对象必须在主类中实例化。我试图以一种优雅的方式完成这件事(我想通过枚举)。示例代码: -

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类的新对象的实例。或者任何其他更好的机制而不是枚举也将受到赞赏。

3 个答案:

答案 0 :(得分:7)

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及其实施是package protected,您可以公开ModulesEnum来公开实施。这样,每个实现只能有一个实例,使它们singleton而不显式使用模式。

如果您打算为每个实现设置多个实例,那么当然也可以使用Factory

答案 1 :(得分: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();
            ...
        }
    }
}

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

答案 2 :(得分:0)

使用静态工厂。

public IntrFactory {

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

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

    ...
}