2016-11-25 20 views
3

我有一個abstract class Foo,其中包含一個功能a(Object o)
根據您使用的Foo的實現情況,a(Object o)的實現方式稍有不同。如何讓用戶選擇要初始化的類別

我希望該程序的用戶能夠確定執行Foo使用什麼(例如,aFoobFoocFoo等),但我想減少我的使用條件邏輯,使我可以在將來更安全地添加到我的程序中。

我目前有一個Enum eBar,其中包含Foo的所有實現的名稱,用戶可以從中進行選擇,但我無法確定如何使用它來初始化該類。

+1

創建基礎對象。每個其他對象都應該從基礎對象繼承。對基礎對象類進行所有操作,以及何時需要檢查使用哪個類嘗試使用instanceof java關鍵字進行檢查。 – Rafal

回答

4

商店美孚的實例來使用,或增加一個方法創建富來使用,在每個枚舉實例:

public enum FooType { 
    A { 
     @Override 
     public Foo createFoo() { 
      return new AFoo(); 
     } 
    }, 
    B { 
     @Override 
     public Foo createFoo() { 
      return new BFoo(); 
     } 
    } 

    public abstract Foo createFoo(); 
} 

然後,一旦用戶選擇了類型,所有你需要做的是

selectedFooType.createFoo().a(object); 
+0

這就是我需要的一切,謝謝! – irishMTS

+0

@irishMTS如果此答案解決了您的問題,請將其標記爲正確答案(單擊答案旁邊的打勾符號)。每一篇關於堆棧溢出的文章都應該對未來的訪問者有用,並且接受答案的問題可能會更有幫助。 – progyammer

+0

感謝提示@progy_rock,但我必須等待一段時間才能讓StackOverflow接受答案,否則我會馬上完成。 – irishMTS

3

[編輯]你能做到這一點使用Enum像下面

public enum FooType { 

     FOO_A(aFoo::new), 
     FOO_B(bFoo::new), 
     FOO_C(cFoo::new); 
     //add as much as you want here 

     private final Supplier<Foo> fooSupp; //the aim of using a supplier is to create a new instance each time you call the create method as mentioned in the comment. 

     FooType(final Supplier<Foo> fooSupp) { 
      this.fooSupp = fooSupp; 
     } 

     public final Foo create(){ 
     return this.fooSupp.get(); 
     } 
} 

然後你可以像這樣使用它

final Foo myFoo = FooType.FOO_A.create(); 
myFoo.o(Object); 
+0

這很好,但我認爲@JB Nizet給出的答案有點容易理解。非常感謝。 – irishMTS

+0

這樣,'create()'函數不會創建一個新對象,而只會在每次調用時返回相同的對象。更好地使用'Supplier '和'FOO_A(aFoo :: new)'。 – glglgl

+0

我明白了,我將編寫和編輯我的答案,讓我們希望他可以使用java 8功能(「供應商」) – Mitchapp