RFR: JDK-8304959: Public API in javafx.css.Match should not return private API class PseudoClassState

John Hendrikx jhendrikx at openjdk.org
Thu Mar 30 23:11:25 UTC 2023


On Thu, 30 Mar 2023 22:34:44 GMT, Kevin Rushforth <kcr at openjdk.org> wrote:

>> The class `PseudoClassState` is private API, but was exposed erroneously in the CSS API. Instead, `Set<PseudoClass>` should have been used. This PR corrects this.
>
> modules/javafx.graphics/src/main/java/javafx/css/Match.java line 79:
> 
>> 77:      * @return the pseudo class state
>> 78:      */
>> 79:     public Set<PseudoClass> getPseudoClasses() {
> 
> Should this be an `ObservableSet`? Changing the type to the `Set` superclass will mean that applications would need to do an `instanceof` check to know whether it was observable or not?

I think that `Match` is supposed to be immutable, given the non-public constructor.  Match itself will never change the set (and nothing else will) so making it observable seems unnecessary.

However, this was not correctly spec'd, and you can change a `Match` now, and since it doesn't make a copy, you'd be changing the pseudo classes of whatever selector created it.  Note that `SimpleSelector` does make a copy, and goes to great pains to not expose anything mutable, but exposes it accidentally via `Match`.

In other words, `simpleSelector.createMatch().getPseudoClasses().clear()` would break the Selectors encapsulation.

I think it's best to close that loophole.  If you agree, I can document this method that it returns an immutable set, which is also what I assumed would be the case in my other PR where I made many of these immutable.

-------------

PR Review Comment: https://git.openjdk.org/jfx/pull/1070#discussion_r1153871673


More information about the openjfx-dev mailing list