以下是在JavaFX中将CellValueFactory
分配给TableColumn
的三种方法。第一个使用匿名类,第二个使用lambda,第三个使用PropertyValueFactory
。
我的问题是关于第三种方式,使用PropertyValueFactory
。
检查了源代码:
我看不出使用这个课有什么好处。
在PropertyValueFactory的源代码中,有一条注释表明它们“通过缓存'PropertyReference'成员变量来”尝试提高大表中的性能“。关于本说明,提到了对RT-13937的引用。我再也找不到这个RT在线了。
以下事情让我感到困惑。
是否存在使用PropertyValueFactory
技术解决的某些特定用例,这些技术无法使用其他两种技术解决?
PropertyReference
成员变量的缓存是否意味着解决在大型表中使用PropertyValueFactory
类的缓慢,这种类的使用反射导致的缓慢,或者是'PropertyValueFactory'类本身是为了解决大型桌子的缓慢问题吗?
/**
First using an anonymous class
*/
TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Person, String> p) {
// p.getValue() returns the Person instance for a particular TableView row
return p.getValue().firstNameProperty();
}
});
/**Second using lambda
*/
TableColumn<Person, String> firstNameCol =new TableColumn<>("First Name");
firstNameCol.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
/**Finally using PropertyValue
*/
TableColumn<Person, String> firstNameCol =new TableColumn<>("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
答案 0 :(得分:0)
在您的使用案例中,使用PropertyValueFactory
使用lambda /匿名类没有任何重大差异。
据我所知,这些是使用PropertyValueFactory
的原因:
因此,如果您正在寻找PropertyValueFactory
的用例,那么最合适的用例是您的属性是正常的POJO属性。
考虑一下:
public class Person {
private String firstName;
private String lastName;
public final String getFirstName() { return firstName; }
public final void setFirstName(String firstName) { this.firstName = firstName; }
public final String getLastName() { return lastName; }
public final void setLastName(String lastName) { this.lastName = lastName; }
}
TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Person, String> p) {
return new SimpleStringProperty(getPropertyReflectively(p.getValue(), "firstName", String.class));
}
});
private static <T> T getPropertyReflectively(Object bean, String propertyName, Class<T> propertyType) {
// Implementation to get property value reflectively
}
所以观察到两件事:
PropertyValueFactory
为你做这件事时会想要这样做?StringProperty
的新实例,并且每次滚动一百万条大表时都会进行反射。我相信所提到的缓存用于观察#2。你可以继续解读&#34;如果你想确定代码,因为我绝对没有尝试这样做。