RFR: 8301302: Platform preferences API [v20]
Michael Strauß
mstrauss at openjdk.org
Thu Nov 2 23:01:44 UTC 2023
On Thu, 2 Nov 2023 22:34:10 GMT, Nir Lisker <nlisker at openjdk.org> wrote:
>> That's correct.
>>
>>> can the value in preferences be `null`?
>>
>> It could be `null` (signalling a removal), but then that's a no-op if the key wasn't present in `effectivePreferences`.
>
> So now I'm wondering why the need for the new type `ChangedValue` when you're already accumulating changes with `SimpleChange`.
>
> The update method can be something like
>
>
> public void update(Map<String, Object> preferences) {
> var changes = new ArrayList<SimpleChange<String, Object>>();
> preferences.forEach((key, newValue) -> {
> var oldValue = effectivePreferences.get(key);
> // oldValue can't be null, so no NPE
> if (Objects.deepEquals(oldValue, newValue)) {
> return;
> }
>
> var change = new SimpleChange<>(this);
> if (oldValue != null && newValue == null) {
> change.setRemoved(key, oldValue);
> effectivePreferences.remove(key);
> } else if (oldValue != null && newValue != null) {
> change.setPut(key, oldValue, newValue);
> effectivePreferences.put(key, newValue);
> } else {
> change.setAdded(key, newValue);
> effectivePreferences.put(key, newValue);
> }
> changes.add(change);
> });
>
> if (!changes.isEmpty()) {
> properties.update(changes, platformKeyMappings);
> fireValueChangedEvent(changes);
> }
> }
>
>
> with `fireValueChangedEvent` being
>
> private void fireValueChangedEvent(List<SimpleChange<String, Object>> changes) {
> invalidationListeners.forEach(listener -> listener.invalidated(this));
> changes.forEach(change -> mapChangeListeners.forEach(listener -> listener.onChanged(change)));
> }
>
> Saves the multiple iterations and the need for a new type.
>
> Then `PreferenceProperties::update` can be adjusted:
>
> public void update(List<SimpleChange<String, Object>> changes, Map<String, String> platformKeyMappings) {
> for (SimpleChange<String, Object> change : changes) {
> ...
>
>
> I didn't test this, it's just an insight.
The main reason for the new record `ChangedValue` is to modularize the code for easier reuse. At the moment, only `PlatformPreferences` uses it, but a follow-up enhancement will introduce a second class `ApplicationPreferences`, which will also use it to compute the effective changes. At that point, we'd either have to duplicate some code, or factor it out anyway.
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1014#discussion_r1380868731
More information about the openjfx-dev
mailing list