【发布时间】:2018-10-27 02:13:26
【问题描述】:
以下是在 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"));
【问题讨论】:
-
这是在 Java 7 中唯一不冗长的方法。在 Java 8 及更高版本中,它几乎是多余的。
-
匿名类会产生更多的
.class文件。 Lambdas 应该产生一个更大的类文件。字节码的大小应该是最小的使用PropertyValueFactory... -
供您参考和上下文,RT-13937 错误已迁移到 jdk 错误跟踪器:bugs.openjdk.java.net/browse/JDK-8112885 并引用 Oracle 论坛问题线程:community.oracle.com/thread/2232797。
-
James_D 谢谢!我发现了解其他开发人员如何详细考虑 API 很有帮助。
-
jewelsea:谢谢你的链接!非常有用!
标签: java javafx tablecolumn