This PR creates a WeakReferenceWrapper object to replace direct uses of 
WeakReference in controls where the referent is a user-supplied object of an 
unknown type.

As noted in JEP 401, which is now integrated into JDK 28, "The garbage 
collection APIs in java.lang.ref ... do not allow developers to manually manage 
value objects in the heap. Attempts to create Reference objects for value 
objects throw IdentityException at run time."

Several core JDK classes such as all of the primitive wrappers (e.g., 
`Integer`, `Character`), `Optional`, `LocalDateTime`, and a few others are now 
value types if JDK 28 is run with the `--enable-preview` option.

The `ListView`, `ComboBox`, `TableView`, and `TreeTableView` controls take a 
parameterized item type and hold items of that type. The following places in 
the implementation create weak references to an item. If that item type is a 
value class -- meaning that it does not have identity -- creating the 
`WeakReference` fails.

As noted in the JBS issue, there are 3 cases to consider.

1. `SelectedItemsReadOnlyObservableList<E>` -- `E` is the item type (created by 
`MultipleSelectionModelBase<T>`) : `ListView`, `TableView`, `ComboBox` (due to 
its skin creating a `ListView<T>`) -- replace with `WeakReferenceWrapper`

2. `TablePosition<S,T>` -- `S` is the item type : `TableView` -- the reference 
is unused, so I removed it

3. `TableCell<S,T>` and `TreeTableCell<S,T>` -- `S` is the item type : 
`TableView`, `TreeTableView` -- replace with `WeakReferenceWrapper`

The new `WeakReferenceWrapper` class takes a referent of any type and either 
creates a WeakReference (if it has identity) or directly stores the reference 
(if it is null or does not have identity). I added a test for the wrapper.

All of the controls tests pass with this fix. I did three test runs as follows:

1. JDK 25
2. JDK 28 without `--enable-preview`
3. JDK 28 with `--enable-preview`

Without the fix, 22 controls tests fails on the 3rd run.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

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

Commit messages:
 - remove debug prints
 - Merge branch 'master' into 8387301-control-weakref
 - add test for WeakReferenceWrapper
 - cleanup
 - docs
 - Remove dead code
 - fix typo
 - Copyright year
 - WIP: 8387301: WeakReferenceWrapper

Changes: https://git.openjdk.org/jfx/pull/2250/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2250&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8387301
  Stats: 235 lines in 6 files changed: 210 ins; 15 del; 10 mod
  Patch: https://git.openjdk.org/jfx/pull/2250.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/2250/head:pull/2250

PR: https://git.openjdk.org/jfx/pull/2250

Reply via email to