Java 是否有一些用例只能由PropertyValueFactory寻址?
下面是在JavaFX中将Java 是否有一些用例只能由PropertyValueFactory寻址?,java,javafx,tablecolumn,Java,Javafx,Tablecolumn,下面是在JavaFX中将CellValueFactory分配给TableColumn的三种方法。第一个使用匿名类,第二个使用lambda,第三个使用PropertyValueFactory 我的问题是关于第三种方法,使用PropertyValueFactory 检查了源代码之后: 我看不出这门课有什么好处 在的源代码中,有一点值得注意,即他们通过缓存“”成员变量“尝试在大型表中提高性能”。结合本说明,提及RT-13937。我在网上找不到这个RT了 下面的事情在我的脑海里很混乱 是否存在使用Pr
CellValueFactory
分配给TableColumn
的三种方法。第一个使用匿名类,第二个使用lambda,第三个使用PropertyValueFactory
我的问题是关于第三种方法,使用PropertyValueFactory
检查了源代码之后:
我看不出这门课有什么好处
在的源代码中,有一点值得注意,即他们通过缓存“”成员变量“尝试在大型表中提高性能”。结合本说明,提及RT-13937。我在网上找不到这个RT了
下面的事情在我的脑海里很混乱
是否存在使用PropertyValueFactory
技术无法解决的特定用例
缓存PropertyReference
成员变量是为了解决在大型表中使用PropertyValueFactory
类的慢度问题,这种慢度是由该类使用反射引起的,还是“PropertyValueFactory”类本身通常是为了解决大型表的慢度问题
/**
首先使用匿名类
*/
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(新回调(){
公共可观察值呼叫(CellDatap){
//p.getValue()返回特定TableView行的Person实例
返回p.getValue().firstNameProperty();
}
});
/**第二次使用lambda
*/
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(cellData->cellData.getValue().firstNameProperty());
/**最后使用PropertyValue
*/
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(新属性ValueFactory(“firstName”));
在您的用例中,使用PropertyValueFactory
与使用lambda/anonymous类没有任何显著差异
据我所知,以下是使用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
}
公共类人物{
私有字符串名;
私有字符串lastName;
公共最终字符串getFirstName(){return firstName;}
public final void setFirstName(字符串firstName){this.firstName=firstName;}
公共最终字符串getLastName(){return lastName;}
public final void setLastName(字符串lastName){this.lastName=lastName;}
}
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(新回调(){
公共可观察值呼叫(CellDatap){
返回新的SimpleStringProperty(getPropertyReflective(p.getValue(),“firstName”,String.class));
}
});
私有静态T GetPropertyReflective(对象bean、字符串propertyName、类propertyType){
//反射式获取属性值的实现
}
因此,观察到两件事:
PropertyValueFactory
为您做到这一点时,为什么要这么做呢StringProperty
实例,并在每次滚动大的一百万条目表时进行反射我相信上面提到的缓存是用于观察的。如果您想确定的话,可以继续“解密”代码,因为我绝对没有尝试这样做。这是Java 7中唯一一种不冗长的方法。在Java8和更高版本中,它是非常冗余的。匿名类会产生更多的
.class
文件。Lambdas应该产生一个更大的类文件。使用PropertyValueFactory
,字节码的大小应该是最小的。对于您的参考和上下文,RT-13937错误被迁移到jdk错误跟踪器:并引用Oracle论坛的一个问题线程:。James\u D谢谢!我发现它有助于知道其他开发者如何详细考虑API…宝石城:谢谢链接!非常有用!我在寻找其他内容时遇到了这个问题,但我只想指出,在FXML文件中可以使用PropertyValueFactory
。尽管我仍然更喜欢lambdas(在代码中),因为它是类型安全的,并且它们避免了反射。