[英]How to pass a static class as an argument in Java
我有一個名為“Entity”的基類,它有一個名為“construct”的靜態方法,它返回一個Entity實例。 我有這個類的幾個不同的子類(為了演示假設我們有“Fruit”和“Vegetable”作為子類)。 我希望能夠做到以下幾點:
Entity a = someFunction(Fruit, textfile)
someFunction然后將文本文件傳遞給Fruit.construct並返回生成的實體。 有一個簡單的方法嗎?
請改用工廠模式 。
將文本文件傳遞給工廠方法,該方法將使用它返回Entity
的正確具體實例
你的意思是這樣的:
public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
return clazz.newInstance();
}
上面的代碼將使用類的無參數構造函數(假設有一個)。
如果您的類需要使用特定構造函數進行實例化,則可以執行以下示例:
public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
// Here I am assuming the the clazz Class has a constructor that takes a String as argument.
Constructor<T> constructor = clazz.getConstructor(new Class[]{String.class});
T obj = constructor.newInstance(textFile);
return obj;
}
將Fruit.class
傳遞給函數,然后對該類對象使用反射來調用正確的構造函數。 請注意,這會通過要求構造函數存在來將您的超類與其子類緊密地耦合在一起。
您的示例中的Fruit
是一個類型,而Fruit.eat()
可能引用靜態方法,而Fruit
不是“靜態類”。
有一個“類對象”,它實際上是一個表示類的Object
。 通過它而不是。 為了實現它,使用了它們的語法Fruit.class
。
您正在嘗試使用過程代碼實現面向對象的設計模式Strategy 。 不要這樣做。
相反,創建一個名為EntityConstructor
的接口,該接口定義方法construct()
。 使Fruit
和Vegetable
實現該界面。 然后更改someFunction()
以獲取該接口的實例。
這是一個實現:
public <T extends Entity> T someMethod(Class<T> entityClass, File file) throws InstantiationException, IllegalAccessException {
T newEntity = entityClass.newInstance();
// do something with file
// ...
return newEntity;
}
你應該看看
靜態方法本身不是繼承的,因為如果您的代碼具有Entity.construct(...),它將不會動態地將其鏈接到子類。
完成所要求的最好方法是使用反射來調用Fruit類上的構造方法(或者將任何類傳遞給someFunction()方法)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.