是否可以有一个包含对象构造函数的枚举?

发布于 2024-11-18 23:12:10 字数 950 浏览 1 评论 0原文

我正在测试一种不同的模式。我已经让代码在 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();
}

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

I'm testing out a different sort of pattern. I've already got the code working in a switch statement, but I'd like to try something a little more ecclectic... for research purposes.

Say I have 4 classes, Class1, Class2, Class3, and Class4 that all extend BaseClass. I want to put them into an enum, like so:

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

In a factory method that is passed an int, I want to be able to do something like this:

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

Is there a cleaner/easier way of doing this? I'm not so much concerned with readability (right now), I'm just curious if this is possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

零度℉ 2024-11-25 23:12:10

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

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

Yes, this is possible. Something like a 'Template Method' approach. So for example

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

With the use of static imports, the client code calling this enumeration would look like:

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

Or

public void fakeMethod(int type) {
  ClassFactory.getValue(type).generate();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文