從技術角度來看,下面的方法createColumn()
使用泛型會有什麼不利嗎?廣泛使用Java泛型有什麼缺點嗎?
public static <S, T> TableColumn<S, T> createColumn(final Class<S> sType,
final Class<T> tType,
final int minWidth,
final Callback<TableColumn<S, T>, TableCell<S, T>> cellFactory) {
TableColumn<S, T> tableColumn = new TableColumn<S, T>();
tableColumn.setMinWidth(minWidth);
tableColumn.setCellFactory(cellFactory);
return tableColumn;
}
以前,我一直在創造TableColumn
對象爲JavaFX是這樣的:
TableColumn<Example, String> colExample = new TableColumn<Example, String>();
colExample.setMinWidth(100);
colExample.setCellFactory(myCellFactory);
...
TableColumn<Other, String> colAnother = new TableColumn<Other, String>();
colAnother.setMinWidth(50);
colAnother.setCellFactory(myOtherFactory);
...
因爲我有很多欄目,我想包創建的工廠方法,並想出了我createColumn()
方法的單點創建對象:
TableUtil.createColumn(Example.class, String.class, 100, myCellFactory);
TableUtil.createColumn(Other.cass, String.class, 50, myOtherFactory);
創建工作正常這種方式,不過,我覺得有點不安全關於createColumn()
中的所有這些泛型(可能因爲我還沒有經常使用泛型)。是否聰明的想法這樣做?或者這種方法有什麼缺點或不安全感?
技術上,因爲類型擦除,則需要進行澆鑄,X,也許X的對象實例化類參數。類型擦除意味着沒有開銷,只是編譯器有時可以爲一個泛型類型的已知實際類型值添加類轉換檢查。即使在不使用泛型時也需要進行手動類型檢查。這對我們所有使用泛型的人來說都是有利的。軟件工程方面的缺點:它僅作爲類參數實現(1),其名稱通常是單個大寫字母(2),當傳遞給其他類時,它變得有點混亂。 Java 8展示了這一點。 –
只是爲了確認,我明白你的意思:如果我想在我的方法中使用''T obj = tType.newInstance();'',我需要''Class''對象,對吧?所以在我的情況下,我很可能會刪除這些參數,但是感謝您的補充。 – user1438038
是的,更好的編碼實踐是調用類的默認構造函數:'tType.getConstructor()'。但也'返回tType。cast(obj);'有時候是需要的。 –