从技术角度来看,使用泛型是否有任何不足之处,如下面的方法createColumn()
?
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;
}
以前,我一直在以这种方式为JavaFX创建TableColumn
个对象:
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()
中的所有泛型感觉有点不安全(可能因为我还没有经常使用泛型)。这样做是聪明的想法吗?或者这种方法有任何缺点或不安全感吗?
答案 0 :(得分:1)
泛型仅用于帮助我们 - 正如您所知,它是一种编译时功能,可对我们使用的类型进行检查并防止意外ClassCastException
。
我可以看到,你不能使用你传递的Class
对象,所以我会把你的方法重写为:
public static <S, T> TableColumn<S, T> createColumn(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;
}
并将调用它:
TableUtil.<Example, String>createColumn(100, myCellFactory);
没有必要使用冗余Class
参数来加载方法签名,因为您只需指出泛型类型。
答案 1 :(得分:0)
这样做是否明智?或者这种方法有任何缺点或不安全感吗?
您的代码没问题。泛型没有运行时成本,只存在于编译时。
答案 2 :(得分:0)
解决方案:在您提供所有提示和建议之后,这就是我最终获得代码的方式。
public static <S, T> TableColumn<S, T> createColumn(final int minWidth,
final Callback<TableColumn<S, T>, TableCell<S, T>> cellFactory) {
TableColumn<S, T> tableColumn = new TableColumn<>();
tableColumn.setMinWidth(minWidth);
tableColumn.setCellFactory(cellFactory);
return tableColumn;
}
创建列:
TableColumn<Example, String> colExample = TableUtil.createColumn(100, myCellFactory);
TableColumn<Other, String> colOther = TableUtil.createColumn(50, myOtherFactory);