Ниже приведены три способа назначения 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"));