2012-06-29 68 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; 
    } 
} 

不枚舉常量類現在,當我嘗試調用在枚舉

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 ..你比我快。 :) –

3

嗯,真的有一個名爲 「AP」 沒有枚舉值。您只有ABvalueOf不使用您在product中存儲的內容。如果你想通過一些自定義標識符來獲得枚舉,那麼你將不得不使用一些翻譯地圖將product轉換爲ProcessorFactory的值(或者只是忽略所有值,效率較低)。

+0

翻譯地圖並不總是更快。我的微基準表明,對於小枚舉(像大多數)和String鍵,由於String的'hashCode()'成本較高,迭代速度更快。對於數字鍵,地圖通常更快。 –

+0

如果getProcessor方法在一個循環內(每15秒)被連續調用,效率會更高。映射或迭代值?考慮到枚舉的大小是5. – RandomQuestion

+0

@Jitendra,我認爲這不重要。對於一小部分值,使用任何更容易的方法。我這樣說是因爲枚舉通常只有很少的值 - 在值的數量取決於某些輸入的情況下,使用映射的原因是它們比那些O(n)循環更有效。 – eran