2012-06-29 2 views
0
public enum ProcessorFactory { 
    A("ap") { 
     Processor create() throws Exception { 
      return new AProcessor(); 
     } 
    }, 

    B("bp"){ 
     Processor create() throws Exception { 
      return new BProcessor(); 
     } 
    }; 

    abstract Processor create() throws Exception; 

    public static Processor getProcessor(String product) throws Exception { 
     ProcessorFactory factory = valueOf(product); 
     return factory.create(); 
    } 

    private String product; 

    private ProcessorFactory(String product) { 
     this.product = product; 
    } 
} 

Теперь, когда я пытаюсь вызватьНет перечисления класса Const в Enum

ProcessorFactory.getProcessor("ap"); 

Он кидает выше исключение. Есть идеи?

ответ

4

Попробуйте ProcessorFactory.getProcessor("A")

или добавить новый метод:

public ProcessorFactory getbyProduct(String product) { 
    for (ProcessorFactory factory : values()) { 
     if (factory.getProduct().equals(processor)) { 
     return factory; 
     } 
    } 
    return null; // or throw an exception 
} 
+1

+ 1..you был быстрее меня. :) –

3

Ну, на самом деле нет никакого значения перечислимого типа под названием "ар". У вас есть только A и B. valueOf не использует то, что вы храните в product. Если вы хотите получить перечисления с помощью некоторого пользовательского идентификатора, вам нужно будет использовать некоторую карту перевода, которая преобразует product в значение ProcessorFactory (или просто переходите ко всем значениям, которые менее эффективны).

+0

Переводная карта не всегда быстрее. Мои микрообъекты показывают, что на маленьких перечислениях (как и большинство) и в строковых ключах быстрее итерации из-за более высоких затрат на 'hashCode()' String. Для числовых клавиш карта обычно быстрее. –

+0

Если метод getProcessor вызывается в цикле (каждые 15 секунд) непрерывно, что было бы более эффективным. Карта или повторение значений? Учитывая размер перечисления 5. – RandomQuestion

+0

@Jitendra, я не думаю, что это имеет значение. Для небольшого набора значений используйте то, что вам легче. Я говорю это, потому что перечисления обычно имеют очень мало значений - в случаях, когда количество значений зависит от некоторого ввода, используйте карты, поскольку они намного эффективнее, чем те O (n). – eran

Смежные вопросы