当前位置: 首页 > 面试题库 >

何时使用JavaFX属性setter和getter,而不是直接使用属性

景鸿才
2023-03-14
问题内容

我熟悉Java,但是刚开始学习JavaFX,尤其是学习JavaFX属性。我了解Oracle的以下示例所示的基本设计模式:

package propertydemo;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;

class Bill {

    // Define a variable to store the property
    private DoubleProperty amountDue = new SimpleDoubleProperty();

    // Define a getter for the property's value
    public final double getAmountDue(){return amountDue.get();}

    // Define a setter for the property's value
    public final void setAmountDue(double value){amountDue.set(value);}

     // Define a getter for the property itself
    public DoubleProperty amountDueProperty() {return amountDue;}

}

我不明白的是什么时候/为什么要使用getter和setter方法,而不是直接使用Property?

我在想的是,您可能希望在getter和/或setter中有一些自定义代码,这些代码可能对数据做一些前后操作/验证,但是如果您创建自定义getter和/或setter,则会得到不同的结果然后,取决于您是直接使用getter
/ setter还是属性,这对我来说似乎很危险。

如果getter / setter只是调用Property的get和set方法,那为什么还要使用它们呢?

任何对此的见解将不胜感激。


问题答案:

JavaFX属性模式旨在扩展旧的标准JavaBean模式。因此,在您的示例中,根据JavaBean约定,您有一个类型double为的(读写)属性amount。这是由两种方法确定的

public double getAmount() ;
public void setAmount(double amount);

JavaBean模式通过“绑定属性”允许某些有限的“可观察性”,其中Bean支持注册PropertyChangeListener。UI工具箱通常需要观察属性并响应更改。例如,Label具有text属性是有意义的。如果text属性发生更改,则Label需要通知该属性,以便它知道自己重新绘制。乍一看,将JavaBean与绑定属性一起使用将是实现此目的的一种方法。但是,在UI工具箱中使用此机制会产生性能问题,因为如果不立即计算该值,就无法通知该值不再有效。这意味着,例如,对属性的每次单独更改都会重新计算布局。

JavaFX团队显然打算做的是定义一个模式

  1. 符合标准JavaBean模式,并且
  2. 支持的可观察属性,可以在每次更改值时都跟踪无效而无需重新计算从属值(“惰性可观察值”)

因此,JavaFX解决方案是创建同时支持ChangeListeners和InvalidationListeners的属性,这些属性在值更改时通知,而s在值不再有效时通知。这意味着,例如,布局机制可以跟踪当前是否有效,而在无效时不强制重新计算。仅在实际屏幕脉冲时(即渲染场景时),并且仅在无效时,才会重新计算布局。

(作为快速的概念验证,请考虑以下事项:

DoubleProperty width = new SimpleDoubleProperty(3);
DoubleProperty height = new SimpleDoubleProperty(4);
ObservableDoubleValue area = Bindings.createDoubleBinding(() -> {
    double a = width.get() * height.get();
    System.out.println("Computed area: "+a);
    return a ;
}, width, height);
System.out.println("Area is "+area.getValue());
width.set(2);
height.set(3);
System.out.println("Area is "+area.getValue());

请注意,中间值当width为2且height仍为4时,永远不会进行计算。)

因此,JavaFX中的值由这些Observable表示,Properties它们支持无效侦听器和更改侦听器,这意味着它们基本上是“惰性可观察的”。通过属性访问器方法(amountProperty()在您的示例中)公开属性本身足以支持此功能。

然而,从语义上讲,公开DoubleProperty表示bean具有type值double。为了保持与旧JavaBean约定的兼容性,此bean应该通过公开相应的getset方法来通告这一事实。因此,JavaFX属性模式既需要“属性访问器”(amountProperty()),也需要标准JavaBean方法(getAmount()setAmount(...))。这意味着遵循JavaFX模式的bean可以在使用标准JavaBean模式的任何地方使用,例如在JPA中。

请注意,该模式才能正常工作,它应该永远是真实的,amountProperty().get() == getAmount()并且amountProperty().set(x)具有相同的效果setAmount(x)。如示例中所述get,通过和set方法可以保证(即使bean类是子类的)final

如果您自己调用方法来检索或更改属性的值,则调用哪个都无所谓,因为可以保证它们具有相同的效果。由于JavaFX属性模式是JavaBean模式的扩展,因此可能会稍微偏爱调用getset方法:从某种意义上来说,访问值仅需要JavaBean功能,而不需要完整的JavaFX属性功能,因此它可能会使语义上只能依靠该功能。但是,实际上,使用哪种都没有区别。



 类似资料:
  • 有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get

  • 正如标题所示,我试图创建一堆属性,但是代码变得重复和混乱。我想使用< code>closure参数使代码更紧凑。 根据C API参考,闭包是一个函数指针,它为getter/setter提供附加信息。我还没有找到一个使用中的例子。 这是我目前使用它的方式: 它按照我想要的方式工作,但它看起来更像一个黑客,而不是什么“pythonic式”的东西。有没有更好的处理方式?例如以某种方式调用闭包。

  • 我有一个基类,它使用php魔术方法__get和__set,可以修改扩展类中的私有属性。然后,我为相关的私有属性构建setter getter函数(类似于http://www.beaconfire-red.com/epic-stufle/better-getters-and-setters-php)

  • 我有一个应用程序,它跨各种片段和活动接受大量用户输入。现在,我将所有变量都放在一个类中,我们将其称为“Report”,并传递主键,以确切了解我所处的“Report”是什么。(开始时有一个ListView,用户可以在其中选择要更改的报表)因为所有用户输入最终都必须写入数据库我有一个想法-为什么不从报表中删除所有变量,并用静态最终列名替换它们,只留下主键变量,然后使用getter和setter直接读取

  • 在Struts(1/2)中,超文本标记语言-Page中的索引属性如下:

  • 我不明白为什么我必须对类中的私有属性使用getter或setter。