尽管由 AbstractUIPlugin#getPreferenceStore()
提供的
IPreferenceStore 的行为尚未更改,但我们已更新 IPreferenceStore 的规范以显式地定义我们已提供的行为。
PropertyChangeEvents 的输入
任何来自 IPreferenceStore 的属性更改事件必须具有一个相同类型的旧值和新值,且该值必须与生成它的 setValue 调用一致。
例如,如果您调用 IPreferenceStore#setValue(String name, long
value)
,则从此方法生成的 PropertyChangeEvent 中的值都将具有 java.lang.Long
类型。
putValue
调用 #putValue
将不会生成 PropertyChangedEvent
。对各种 #setValue
方法的调用将。
OSGI 首选项和 IPreferenceStore 之间的关系
由 AbstractUIPlugin#getPreferenceStore()
提供的 IPreferenceStore 是
ScopedPreferenceStore
(它使用 org.osgi.service.prefs.Preferences
作为后端)的实例。org.osgi.service.prefs.Preferences
仅以字符串的形式传播更改事件。
ScopedPreferenceStore
包装 IPreferenceStore#setValue(String name, String value)
生成的那些 OSGI 事件和一个它自己的 PropertyChangeEvents
,并将该事件转发到其侦听器。对于 IPreferenceStore#setValue
的其它实现,ScopedPreferenceStore
将创建它自己的正确类型的事件且不传播来自 OSGI 首选项的事件。
因为仍有可能通过 OSGI 首选项获得事件(在实例的首选项导入期间),所以应该准备
ScopedPreferenceStore
的侦听器以获取其更改事件中的输入值和字符串值。OSGI 事件的类型始终是 java.lang.String
。
它始终可能从 Eclipse SDK 中的现有 IWorkbenchWindows 获取空 org.eclipse.swt.widgets.Shell。我们现在显式地定义这些情况的发生条件, 即 shell 何时未被创建或者 IWorkbenchWindow 何时已被关闭。