是否有某些用例只能由 PropertyValueFactory 寻址?

Is there some use case addressable only by PropertyValueFactory?

以下是在 JavaFX 中将 CellValueFactory 分配给 TableColumn 的三种方法。第一个使用匿名 class,第二个使用 lambda,第三个使用 PropertyValueFactory .

我的问题是关于第三种方式,使用PropertyValueFactory

已查看源代码:

PropertyValueFactory

我看不出使用这个 class 有什么好处。

PropertyValueFactory的源代码中,有一个注释,他们"try to improve performance in large tables"通过缓存一个'PropertyReference'成员变量。与此说明相关,提到了对 RT-13937 的引用。我在网上找不到这个 RT。

下面的事情我脑子里乱七八糟的。

是否有某些使用 PropertyValueFactory 技术无法使用其他两种技术解决的特定用例?

PropertyReference 成员变量的缓存是为了解决在大表中使用 PropertyValueFactory class 的缓慢问题,这种缓慢是由 class 引起的的反射的使用,或者 'PropertyValueFactory' class 本身是为了解决大表的缓慢问题?

 /**
   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"));

在您的用例中,使用 PropertyValueFactory 与使用 lambda/anonymous 类.[=16= 没有任何 显着 差异]

据我所知,这些是使用 PropertyValueFactory 的原因:

  1. 它更短而且据说更方便,但我发现使用 lambda 也没有那么长。
  2. 它有缓存,就像你提到的那样,但它用于非 JavaFX 属性(即使用反射)。

因此,如果您正在寻找 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
}

所以观察到两件事:

  1. 你需要自己写乱七八糟的反射东西。可以做到,但是 PropertyValueFactory 已经为您做到了,为什么还要这样做呢?
  2. 您正在返回 StringProperty 新实例 ,并且每次滚动您的大一百万条目时也会进行反思 table。

我相信提到的缓存用于观察#2。如果您想确定,可以继续 "decipher" 代码,因为我绝对没有尝试这样做。