其他答案已經回答了你提出的問題。但是我想退一步瞭解一下你用這種工廠方法試圖完成的事情。該工廠基本上提供了一個到IDataSource
參數的數據類型圖。 Dependency injection可能是更合適的模式,因爲這是一個衆所周知的小數據類型和實現(如您的示例所示)。
比方說,你要存儲在蒙戈在MySQL中的所有Widgets
但所有Gadgets
,你可能有兩類:實現IDataSource<Widget>
一個MongoWidgetDataSource
和實現IDataSource<Gadget>
一個MysqlGadgetDataSource
。
而不是在數據使用者內硬編碼工廠方法調用如MyFactory.getDataSource(Widget.class)
,我會注入適當的IDataSource
依賴項。我們可能有MyService
,它使用小部件(存儲在mongo中)。使用你提出了一個工廠應該是這樣的:
public class MyService {
public void doSomething() {
String value = MyFactory.getDataSource(Widget.class).getSomething();
// do something with data returned from the source
}
}
相反,你應該注入適當的數據源作爲構造ARG到服務:
public class MyService {
private final IDataSource<Widget> widgetDataSource;
public MyService(IDataSource<Widget> widgetDataSource) {
this.widgetDataSource = widgetDataSource;
}
public void doSomething() {
String value = widgetDataSource.getSomething();
// now do something with data returned from the source
}
}
這具有使額外的好處你代碼更可重用,更容易進行單元測試(模擬依賴)。
然後,在您實例化MyService
時,您還可以連接數據源。許多項目使用依賴注入框架(如Guice)使這更容易,但它不是一個嚴格的要求。但個人而言,我從來沒有在沒有任何實際規模或持續時間的項目上工作。
如果不使用DI框架,你只需實例化的依賴關係,當你創建調用服務:
public static void main(String[] args) {
IDataSource<Widget> widgetDataSource = new MongoWidgetDataSource();
IDataSource<Gadget> gadgetDataSource = new MysqlGadgetDataSource();
MyService service = new MyService(widgetDataSource, gadgetDataSource);
service.doSomething();
}
在吉斯,你會線了這些數據的來源是這樣的:
public class DataSourceModule extends AbstractModule {
@Override
protected void configure() {
bind(new TypeLiteral<IDataSource<Widget>>() {}).to(MongoWidgetDataSource.class);
bind(new TypeLiteral<IDataSource<Gadget>>() {}).to(MysqlGadgetDataSource.class);
}
}
依賴倒置對思考問題有點不同,但它可能導致更多的解耦,可重用和可測試的代碼庫。
這並不回答你的問題,但你可以安全地使用'=='來代替'equals'的'Class'es。 – Boann