Возможно ли иметь перечисление, которое содержит конструкторы для объектов? - PullRequest
2 голосов
/ 07 июля 2011

Я тестирую другой тип паттернов. У меня уже есть код, работающий в операторе 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();
}

Есть ли более чистый / простой способ сделать это? Меня не так сильно волнует читаемость (прямо сейчас), мне просто любопытно, возможно ли это.

1 Ответ

3 голосов
/ 07 июля 2011

Да, это возможно.Что-то вроде подхода «Шаблонный метод».Так, например,

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...