On Sat, 16 May 2026 15:52:30 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.
>> 
>> ---------
>> - [x] I confirm...
>
> Michael Strauß has updated the pull request with a new target base due to a 
> merge or a rebase. The pull request now contains six commits:
> 
>  - Merge branch 'master' into feature/property-metadata
>    
>    # Conflicts:
>    #  modules/javafx.graphics/src/test/addExports
>  - Merge branch 'master' into feature/property-metadata
>  - review changes
>  - ReadOnlyProperty.getDeclaringClass() tests
>  - doc
>  - Enhanced property metadata

I'd like to conclude the discussion of this enhancement, if possible, for the 
JFX 27 release. The HeaderBar API, which is on course to be finalized in JFX 
27, uses attached properties in the way this enhancement formalizes them (see 
`dragType`, `buttonType`, `prefButtonType`, `leftSystemInset`, 
`rightSystemInset`, `minSystemHeight` in `HeaderBar`).

If we _don't_ go forward with this formalism, then the API in HeaderBar should 
be removed; otherwise it will forever be the odd one out compared to other 
attached properties (of the non-observable kind). Note that we don't discuss 
the _existence_ of attached properties here, they've always been an integral 
part of JavaFX. This enhancement only extends the `Property` API to also be 
applicable to attached properties.

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

PR Comment: https://git.openjdk.org/jfx/pull/2015#issuecomment-4508850228

Reply via email to