RFR: JDK-8304933: BitSet (used for CSS pseudo class states) listener management is incorrect [v2]
John Hendrikx
jhendrikx at openjdk.org
Mon Apr 10 23:10:41 UTC 2023
On Mon, 10 Apr 2023 22:07:41 GMT, John Hendrikx <jhendrikx at openjdk.org> wrote:
>> As with the earlier comment, any changes to the behavior of a null listener should be done separately and not part of this PR.
>
> Alright, I'll file another ticket for that. The general state of this class is quite poor, as it does not follow any of the contracts of the interfaces it implements (including `Collection`, `Set` and `ObservableSet`). This is bad because even though this class is an implementation detail, it does get exposed as an `ObservableSet` via `Node#getPseudoClassStates`. Things that it violates for example are:
>
> node.getPseudoClassStates().retainAll(null); // no exception
>
> Or:
>
> node.getPseudoClassStates().retainAll(set2); // does nothing if set2 is not a BitSet
>
> Or:
>
> // fails, even if they're the same because `equals` assumes another BitSet
> node.getPseudoClassStates().equals(Set.of(PseudoClass.getPseudoClass("armed"));
>
> // works:
> Set.of(PseudoClass.getPseudoClass("armed")).equals(node.getPseudoClassStates());
>
> Same goes for the hash code value; these are strictly defined for sets, but `BitSet` violates it causing problems when using these sets as keys. This causes numerous odd problems that I had to track down while implementing #1076 -- I can only assume very few people are using these API's in the wild.
Filed https://bugs.openjdk.org/browse/JDK-8305816 so we don't forget.
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1071#discussion_r1162156819
More information about the openjfx-dev
mailing list