该示例创建一个Person类,其属性为字段:
public static class Person { private final SimpleStringProperty firstName; ...
但吸气剂不是属于物业,而是属于他们的价值观
public String getFirstName() { return firstName.get(); }
所以当它在列中将它们绑定到TableCells时,它将它们包装在一个新属性中:
emailCol.setCellValueFactory( new PropertyValueFactory<Person,String>("firstName"));
这对我来说似乎很复杂,并且错过了事件传播的真正优势,不仅仅是使用它:
firstNameCol.setCellValueFactory( celldata -> celldata.getValue().firstNameProperty());
我的问题:这个例子是否有理由不直接在控件中公开和使用bean的属性?我在这里错过了什么吗?
注意:我确实以这种方式更改了代码,并且示例运行得更好:其他控件在Person实体中的更新立即传播,没有调用table.refresh(),例如
解决方法
public class Person { private final StringProperty firstName = new SimpleStringProperty(); public StringProperty firstNameProperty() { return firstName ; } public final String getFirstName() { return firstNameProperty().get(); } public final void setFirstName(String firstName) { firstNameProperty().set(firstName); } }
那么你的代码版本都可以在不调用table.refresh()的情况下工作.这是PropertyValueFactory的预期用途,从documentation开始就相当清楚.
但是,你是正确的,lambda表达式是比PropertyValueFactory更好的方法.除了引用的原因外,在PropertyValueFactory上使用lambda表达式还有其他主要优点.首先,最重要的是,PropertyValueFactory只是将属性的名称作为String,这意味着它没有编译时检查.所以,如果你拼错了房产的名称:
firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstname"));
这会编译得很好,你最终会在列中找到空白单元格.这可能很难调试(正如本网站上的问题数量所证明的那样,需要帮助解决这类错误:例如Javafx PropertyValueFactory not populating Tableview).
其次,PropertyValueFactory通过反射工作,这比lambda表达式慢得多.这可能导致可测量的性能差异,例如在对具有大量数据的表进行排序时.
引入PropertyValueFactory的原因基本上是历史性的.在Java 8之前,当然没有lambda表达式,因此没有这个便利类的单元工厂的最小实现是通过匿名内部类:
firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person,String>,ObservableValue<String>>() { @Override public ObservableValue<String> call(TableColumn.CellDataFeatures<Person,String> cellData) { return cellData.getValue().firstNameProperty(); } });
由于该代码非常可怕,JavaFX团队引入了PropertyValueFactory只是为了使API更易于使用.
使用Java 8及更高版本时,PropertyValueFactory应该被视为遗留类,并且lambda表达式应该是首选.当然,早于Java 8的文档仍然存在(事实上,你明确地链接了JavaFX 2中的文档 – 虽然most recent version仍然没有更新),并且 – 坦率地说 – 太多其他作者复制了没有正确思考它的风格.对于完全弃用PropertyValueFactory类,可能有一个很好的例子.
(所以:TL; DR:不,你没有遗漏任何东西.)