是否可以使用包含对象构造函数的枚举?

时间:2011-07-07 16:00:45

标签: java enums constructor

我正在测试一种不同的模式。我已经在switch声明中使用了代码,但是我想尝试一些更为折衷的东西......用于研究目的。

假设我有4个课程,Class1Class2Class3Class4都延伸BaseClass。我想把它们放进enum,就像这样:

enum ClassFactories { 
  Class1(Class1.class), 
  Class2(Class2.class), 
  Class3(Class3.class), 
  Class4(Class4.class);

  private final Class factory;
  ClassFactories(Class factory) {
    this.factory = factory;
  }

  public BaseClass generate() {
    BaseClass b = null;
    try {
      b = (BaseClass)this.factory.newInstance();
    } catch (Exception e) {
      // handle any exceptions
    }
    return f;
  }
}

在传递int的工厂方法中,我希望能够做到这样的事情:

public void fakeMethod(int type) {
  BaseClass someClass = ClassFactories.values()[type].generate();
  someClass.doStuff();
}

有更清洁/更简单的方法吗?我不太关心可读性(现在),我只是好奇这是否可能。

1 个答案:

答案 0 :(得分:3)

是的,这是可能的。类似于“模板方法”的方法。例如,

public enum ClassFactory {
     Class1() {
          @Override public void generate() { 
               System.out.println("I'm in Class 1."); 
          }
     },
     Class2() {
          @Override public void generate() { 
               System.out.println("I'm in Class 2."); 
          }
     };
     //template method
     public abstract void generate();

   private static final Map<Integer, ClassFactory > lookup
   = new HashMap<Integer, ClassFactory >();

   static {
   for (ClassFactory s : EnumSet.allOf(ClassFactory.class))
         lookup.put(s.getIntValue(), s);
   }

   public static ClassFactory getValue(int intValue) {
      return lookup.get(intValue);
   }

}

INVOCATION CODE

使用静态导入时,调用此枚举的客户端代码如下所示:

Class1.generate();
Class2.generate();
//or better...
getClass().generate();

或者

public void fakeMethod(int type) {
  ClassFactory.getValue(type).generate();
}