[英]Java, list of class types
我正在研究一個java應用程序。 它是一個抽象類Model和2個派生類Model 1和Model 2. Model1和Model2的行為不同,所以我想允許用戶從兩個中選擇一個模型。 它可以實現如下:
Model model;
If(response==1){
model = new Model1();
}else if(response==2){
model = new Model2();
}
現在問題是,如果我添加一個新類Model3,我必須重寫代碼。 我可以創建一個List,在那里我將從每個類中添加一個實例,然后我會添加一個靜態方法,它將返回一個新的類實例,但我希望它可以用更多樣式來完成。
是否可以創建一個List來保存每個類的類型 。 從這個List我可以創建一個菜單來選擇一個模型,然后使用該類型來創建用戶需要的類。
那么有可能創建一個List<Class>
,然后使用Class對象作為構造函數來創建給定類的實例嗎?
您可以創建供應商列表:
static final List<Supplier<Model>> MODEL_MAKERS = ImmutableList.of(
new Supplier<Model>() { public Model get() { return new Model1(); } },
new Supplier<Model>() { public Model get() { return new Model2(); } },
new Supplier<Model>() { public Model get() { return new Model3(); } }
);
您可以使用反射來解決問題,但這需要在Java的正常異常處理機制之外步進,需要零參數的public
構造函數和public
類,這限制了代碼在維護時如何以未經javac
檢查的方式進行更改,並且不是在這種情況下是必要的
如果您確定它將具有公共no-args構造函數,則可以使用Class.newInstance()
對於更復雜的用法,您可以使用Class.getConstructor找到Constructor對象,然后以這種方式調用它。
一旦你擁有了它,就可以相對容易地將你的Class
es粘貼到Map
或者做一些事情來查找和創建實例。
是的,您可以在Class上使用newInstance()方法來構造一個。 它必須有一個no-args構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.