当前位置: 首页 > 知识库问答 >
问题:

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

明安阳
2023-03-14

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

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

检查了源代码:

PropertyValue工厂

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

在Property tyValueFactory的源代码中,有一个注释,他们通过缓存一个'属性引用'成员变量来“尝试提高大表中的性能”。与此注释相关,提到了对RT-13937的引用。我在网上再也找不到这个RT了。

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

是否有一些特定的用例是使用Property tyValueFactory技术解决的,而无法使用其他两种技术中的任何一种来解决?

缓存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个答案

扶誉
2023-03-14

在您的用例中,使用Property tyValueFactory与使用lambda/匿名类没有任何显着差异。

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

  1. 虽然我发现使用lambda也没有那么长,但它更短,而且应该更方便
  2. 它有缓存,正如您所提到的,但它适用于非JavaFX属性(即使用反射)

因此,如果您正在寻找Property tyValueFactory的用例,那么最合适的用例是当您的属性是普通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,如果你想确定,你可以继续“破译”代码,因为我绝对没有尝试这样做。

 类似资料:
  • 问题内容: 我想描述一下AOP有效参与应用程序设计的可能情况。到目前为止,我所遇到的是: 伐木相关 安全检查 交易管理 调整旧版应用程序 还要别的吗? (不一定是基于Spring的基于代理的AOP,而是JBoss AOP。) 问题答案: 我可以举两个使用它的示例: 在JMX中自动注册对象以进行远程管理。如果使用我们的注释对一个类进行注释,则我们可以通过一个方面来监视该类的新实例,并将其自动注册到J

  • 我正在尝试使用TextWatcher界面,以检测哪个EditText被更改了。我有一个使用10个EditTexts的活动,为每个文本使用10个TextWatchers看起来很奇怪。 有没有办法只使用一个TextWatcher,并在函数afterTextChanged中的可编辑项上使用switch语句?

  • 我正在尝试使用JSoup从Amazon中提取价格,但有两个不同的元素可以提取它。我可以从元素中的aria-tag属性中获取它,也可以从元素中的文本中获取它。最好,我总是想从aria-tag属性中获取它,但有时它不存在,所以我需要从第二个span类中提取它。我的问题是,如何创建一个if语句来检查属性是否有任何文本,然后如果没有,尝试从第二个span类中提取文本? 另外,我试图从名称相同的类中获取几个

  • 喷雾布线基于Akka actor系统。在我记得的所有示例代码中,路由都是“快速”完成的,并且将实际工作派生给其他参与者,除非需要同步完成以获得响应。 换句话说,喷雾路由多线程模型到底是什么? 我可以将验证生成给另一个参与者,但在这种情况下,REST API响应将不再能够报告传入内容是否存在错误。处理这件事的最佳方法是什么?

  • 关于合流博客 只有一次语义是可能的:Kafka就是这样做的 精确一次语义学:即使生产者重试发送消息,它也会导致消息仅一次传递给最终消费者。精确一次语义学是最理想的保证,但也是一个很少被理解的保证。这是因为它需要消息传递系统本身与生成和消费消息的应用程序之间的合作。例如,如果在成功消费消息后,您将Kafka消费者倒带到上一个偏移量,您将再次收到从该偏移量到最新偏移量的所有消息。这说明了为什么消息传递

  • 我的查询: 这给出了这个表的结果: 但我希望我能把年份作为标题,把总数作为一行。。。帮助:c