JavaFX属性中的Value和ObjectValue有什么区别?

时间:2018-10-19 17:13:09

标签: java javafx

我正在看这张图:

enter image description here

,仍然无法理解Value和ObjectValue之间的区别。例如,什么必须返回WritableValue<String>#getValue()方法和WritableObjectValue<String>#get()方法?

1 个答案:

答案 0 :(得分:2)

JavaFX的开发人员希望具有与原语兼容的可观察值。否则,JavaFX中使用的每个数字都必须是会影响性能的包装器类型(例如Integer)。但是,ObservableValue只能处理引用。为了解决这个问题,他们为常见的基本类型和某些常见的引用类型(例如String)创建了子接口。这些接口采用ObservableXXXValue的形式。

这些ObservableXXXValue接口定义了一个名为get的方法,该方法返回接口所针对的特定类型。例如,ObservableIntegerValue的{​​{1}}方法返回get。如果您查看层次结构,将会看到:

  • int
    • Observable
      • ObservableValue<T>
        • ObservableObjectValue<T>
        • ObservableStringValue
        • ObservableListValue<E>
        • ObservableSetValue<E>
      • ObservableMapValue<K,V>
        • ObservableNumberValue
        • ObservableIntegerValue
        • ObservableLongValue
        • ObservableFloatValue
      • ObservableDoubleValue

ObservableBooleanValue接口与WritableValuesetValue 1 遵循相同的模式。

set接口扩展了ObservableNumerValue,并提供了一些类似ObservableValue<Number>的方法(例如Number)。然后,它的每个子接口都为其所表示的原始类型(例如intValue)提供get方法。 intObservableBooleanValue的作用相同。

boolean接口有些特殊。例如,Observable[List|Set|Map]Value扩展了两者 ObservabeListValueObservableObjectValue<ObservableList<E>>。这允许实现同时表现为可观察的值和可观察的列表。这些接口直到稍后才添加(JavaFX 2.1)。

我假设 2 存在ObservableList<E>ObservableObjectValue接口,以提供对称性-既在原理上又对ObservableStringValue接口进行镜像。

因此,要直接回答您的问题,WritableValueget之间没有区别。在getValue和{{1}返回ObservableObjectValue和{{ 1}}返回get。因此,实现直接处理访问和存储的原始类型。


1。 getValue还提供了ObservableIntegerValue,其子接口提供了适当的get方法。但是,它是不可观察的(不会扩展intgetValue)。
2。 @fabian在评论中确认了假设。


在处理实现时,这变得更加有趣。我不会赘述过多,但会给出一个示例层次结构。

  • Number ^
    • WritableValue
      • getValue 实现get
      • Observable 实现ObservableValue
        • ObservableStringValue
        • StringExpression 实现StringBindingBinding<String>
          • ReadOnlyStringProperty
            • ReadOnlyProperty<String> *
              • ReadOnlyStringPropertyBase *

^接口。
*一个具体的类。
没有标记表示抽象类。

并注意:

  • StringProperty扩展了Property<String>
  • WritableStringValue扩展了StringPropertyBase
  • SimpleStringProperty扩展了ReadOnlyStringWrapperReadOnlyProperty