是否有一些用例只能通过PropertyValueFactory进行寻址?

时间:2018-05-16 22:26:29

标签: java javafx tablecolumn

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

我的问题是关于第三种方式,使用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"));

1 个答案:

答案 0 :(得分:0)

在您的使用案例中,使用PropertyValueFactory使用lambda /匿名类没有任何重大差异。

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

  1. 它更短,据说更方便,但我发现使用lambda的时间要长得多。
  2. 它有缓存,就像你提到的那样,但它适用于非JavaFX属性(即使用反射)。
  3. 因此,如果您正在寻找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新实例,并且每次滚动一百万条大表时都会进行反射。
    3. 我相信所提到的缓存用于观察#2。你可以继续解读&#34;如果你想确定代码,因为我绝对没有尝试这样做。