On Fri, 19 Dec 2025 20:56:27 GMT, Michael Strauß <[email protected]> wrote:
> Implementation of [enhanced property > metadata](https://gist.github.com/mstr2/2fec0303fc440b8eaeb126befc76eb5c). > > ### New API > This PR includes the following API additions: > > 1. `ReadOnlyProperty.getDeclaringClass()` and its default implementation. > 2. The `javafx.beans.property.AttachedProperty` interface. > 3. New constructors for all `Simple<*>Property` and `ReadOnly<*>Wrapper` > classes, accepting the declaring class of the property. > > The declaring class is stored in a new field in the `Simple<*>Property` > classes. If a legacy constructor is used that doesn't specify the declaring > class, the `ReadOnlyProperty.getDeclaringClass()` default implementation is > called the first time the `Simple<*>Property.getDeclaringClass()` method is > called, and its result is stored for future retrieval. > > ### Testing > For testing, this PR also includes the > `test.util.property.PropertyMetadataVerifier` tool. It systematically tests > all public and protected properties of a class, and ensures conformance to > the following rules: > * `ReadOnlyProperty.getBean()` returns the object instance of the enclosing > class, or the target object instance if the property is an attached property. > * `ReadOnlyProperty.getName()` returns the name of the property, which must > correspond to the name of the property getter (excluding the word "Property"). > * `ReadOnlyProperty.getDeclaringClass()` returns the enclosing class of the > property getter. > * The declaring class of a `Simple<*>Property` or `ReadOnly<*>Wrapper` must > be specified in the constructor, not resolved at runtime. > * `getBean()`, `getName()`, and `getDeclaringClass()` must not be overridden > in subclasses of `Simple<*>Property` or `ReadOnly<*>Wrapper`. > * An instance property does not implement `AttachedProperty`. > * An instance property has a parameterless property getter. > * An attached property implements `AttachedProperty`. > * An attached property has a static single-argument property getter that > accepts the target object. > * `AttachedProperty.getTargetClass()` returns the class of the single > parameter of the static property getter. > * A property getter does not return an instance of `ReadOnly<*>Wrapper`, it > returns the result of calling `ReadOnly<*>Wrapper.getReadOnlyProperty()`. > > Many properties in existing JavaFX classes violate the > `PropertyMetadataVerifier` rules in some way or shape. This PR won't address > these issues, this will be done in a future cleanup PR. Not going away - possibly. But it does not change the fact that these properties are stored in the wrong place. Adding some sort of band-aid code to help with some use cases seems a bit wrong to me. It does not mean that we don't have the actual problem. Perhaps you could describe a couple of use cases where the new API would shine, use cases where it is impossible to achieve the goal using the existing APIs. ------------- PR Comment: https://git.openjdk.org/jfx/pull/2015#issuecomment-3774684544
