Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一些用例只能由PropertyValueFactory寻址?_Java_Javafx_Tablecolumn - Fatal编程技术网

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

Java 是否有一些用例只能由PropertyValueFactory寻址?,java,javafx,tablecolumn,Java,Javafx,Tablecolumn,下面是在JavaFX中将CellValueFactory分配给TableColumn的三种方法。第一个使用匿名类,第二个使用lambda,第三个使用PropertyValueFactory 我的问题是关于第三种方法,使用PropertyValueFactory 检查了源代码之后: 我看不出这门课有什么好处 在的源代码中,有一点值得注意,即他们通过缓存“”成员变量“尝试在大型表中提高性能”。结合本说明,提及RT-13937。我在网上找不到这个RT了 下面的事情在我的脑海里很混乱 是否存在使用Pr

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

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

检查了源代码之后:

我看不出这门课有什么好处

在的源代码中,有一点值得注意,即他们通过缓存“”成员变量“尝试在大型表中提高性能”。结合本说明,提及RT-13937。我在网上找不到这个RT了

下面的事情在我的脑海里很混乱

是否存在使用
PropertyValueFactory
技术无法解决的特定用例

缓存
PropertyReference
成员变量是为了解决在大型表中使用
PropertyValueFactory
类的慢度问题,这种慢度是由该类使用反射引起的,还是“PropertyValueFactory”类本身通常是为了解决大型表的慢度问题

/**
首先使用匿名类
*/
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(新回调(){
公共可观察值呼叫(CellDatap){
//p.getValue()返回特定TableView行的Person实例
返回p.getValue().firstNameProperty();
}
});
/**第二次使用lambda
*/
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(cellData->cellData.getValue().firstNameProperty());
/**最后使用PropertyValue
*/
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(新属性ValueFactory(“firstName”));

在您的用例中,使用
PropertyValueFactory
与使用lambda/anonymous类没有任何显著差异

据我所知,以下是使用
PropertyValueFactory
的原因:

  • 虽然我发现使用lambda也没那么长,但它更短,而且应该更方便
  • 它有缓存,正如您所提到的,但它用于非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
    }
    
    公共类人物{
    私有字符串名;
    私有字符串lastName;
    公共最终字符串getFirstName(){return firstName;}
    public final void setFirstName(字符串firstName){this.firstName=firstName;}
    公共最终字符串getLastName(){return lastName;}
    public final void setLastName(字符串lastName){this.lastName=lastName;}
    }
    TableColumn firstNameCol=新的TableColumn(“名字”);
    firstNameCol.setCellValueFactory(新回调(){
    公共可观察值呼叫(CellDatap){
    返回新的SimpleStringProperty(getPropertyReflective(p.getValue(),“firstName”,String.class));
    }
    });
    私有静态T GetPropertyReflective(对象bean、字符串propertyName、类propertyType){
    //反射式获取属性值的实现
    }
    
    因此,观察到两件事:

  • 你需要写下你自己混乱的反思。这是可以做到的,但是当
    PropertyValueFactory
    为您做到这一点时,为什么要这么做呢
  • 您将返回一个新的
    StringProperty
    实例,并在每次滚动大的一百万条目表时进行反射

  • 我相信上面提到的缓存是用于观察的。如果您想确定的话,可以继续“解密”代码,因为我绝对没有尝试这样做。

    这是Java 7中唯一一种不冗长的方法。在Java8和更高版本中,它是非常冗余的。匿名类会产生更多的
    .class
    文件。Lambdas应该产生一个更大的类文件。使用
    PropertyValueFactory
    ,字节码的大小应该是最小的。对于您的参考和上下文,RT-13937错误被迁移到jdk错误跟踪器:并引用Oracle论坛的一个问题线程:。James\u D谢谢!我发现它有助于知道其他开发者如何详细考虑API…宝石城:谢谢链接!非常有用!我在寻找其他内容时遇到了这个问题,但我只想指出,在FXML文件中可以使用
    PropertyValueFactory
    。尽管我仍然更喜欢lambdas(在代码中),因为它是类型安全的,并且它们避免了反射。