我正在看这张图:
,仍然无法理解Value和ObjectValue之间的区别。例如,什么必须返回WritableValue<String>#getValue()
方法和WritableObjectValue<String>#get()
方法?
答案 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
接口与WritableValue
和setValue
1 遵循相同的模式。
set
接口扩展了ObservableNumerValue
,并提供了一些类似ObservableValue<Number>
的方法(例如Number
)。然后,它的每个子接口都为其所表示的原始类型(例如intValue
)提供get
方法。 int
对ObservableBooleanValue
的作用相同。
boolean
接口有些特殊。例如,Observable[List|Set|Map]Value
扩展了两者 ObservabeListValue
和ObservableObjectValue<ObservableList<E>>
。这允许实现同时表现为可观察的值和可观察的列表。这些接口直到稍后才添加(JavaFX 2.1)。
我假设 2 存在ObservableList<E>
和ObservableObjectValue
接口,以提供对称性-既在原理上又对ObservableStringValue
接口进行镜像。
因此,要直接回答您的问题,WritableValue
与get
之间没有区别。在getValue
和{{1}返回ObservableObjectValue
和{{ 1}}返回get
。因此,实现直接处理访问和存储的原始类型。
1。 getValue
还提供了ObservableIntegerValue
,其子接口提供了适当的get
方法。但是,它是不可观察的(不会扩展int
或getValue
)。
2。 @fabian在评论中确认了假设。
在处理实现时,这变得更加有趣。我不会赘述过多,但会给出一个示例层次结构。
Number
^
WritableValue
getValue
实现get
Observable
实现ObservableValue
ObservableStringValue
StringExpression
实现StringBinding
和Binding<String>
ReadOnlyStringProperty
ReadOnlyProperty<String>
*
ReadOnlyStringPropertyBase
* ^接口。
*一个具体的类。
没有标记表示抽象类。
并注意:
StringProperty
扩展了Property<String>
WritableStringValue
扩展了StringPropertyBase
SimpleStringProperty
扩展了ReadOnlyStringWrapper
和ReadOnlyProperty