Есть ли какой-то вариант использования, адресуемый только PropertyValueFactory? - PullRequest
0 голосов
/ 17 мая 2018

Ниже приведены три способа назначения CellValueFactory для TableColumn в JavaFX.Первый использует анонимный класс, второй - лямбду, а третий - 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 голосов
/ 17 мая 2018

В вашем случае использования значительных различий при использовании PropertyValueFactory по сравнению с использованием лямбда / анонимных классов нет.

Насколько я знаю, это причины использования PropertyValueFactory:

  1. Это короче и, предположительно, удобнее, хотя я считаю, что использование лямбды тоже не намного дольше.
  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, а также выполняете рефлексию каждый раз, когда прокручиваете свою большую таблицу на миллион записей.

Я считаю, что упомянутое кэширование используется для наблюдения # 2. Вы можете продолжать «расшифровывать» коды, если хотите быть уверенными, потому что я определенно не пытался это сделать.

...