【问题标题】:Is it possible to have an enum that contains constructors for objects?是否可以有一个包含对象构造函数的枚举?
【发布时间】:2011-07-07 16:00:45
【问题描述】:

我正在测试一种不同的模式。我已经在switch 语句中编写了代码,但我想尝试一些更不拘一格的东西……出于研究目的。

假设我有 4 个类,Class1、Class2、Class3 和 Class4,它们都扩展了 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();
}

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

【问题讨论】:

  • 为什么你要添加枚举但仍然传递一个int?为什么不fakeMethod(ClassFactories cf)?
  • 这是个好问题。将它作为枚举传递似乎更有意义。

标签: java enums constructor


【解决方案1】:

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

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);
   }

}

调用代码

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

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

或者

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

【讨论】:

  • 在这种情况下,看起来类是在枚举内部声明的。我没看错吗?
  • 是的,此代码不是您问题的确切答案;但只是为了说明什么是可能的。因此,要获得准确的答案,您需要更改 generate 方法的实现并使其返回类实例而不是 void。在实现中,您将实例化一个类并返回它,而不是 "System.out.println("I'm in Class 1.");"。
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2021-09-14
相关资源
最近更新 更多