Introduction

There is a number of places where various listeners (strong as well as weak) 
are added, to be later disconnected in one go. For example, Skin 
implementations use dispose() method to clean up the listeners installed in the 
corresponding Control (sometimes using 
LambdaMultiplePropertyChangeListenerHandler class).

This pattern is also used by app developers, but there is no public utility 
class to do that, so every one must invent their own, see for instance
https://github.com/andy-goryachev/FxTextEditor/blob/master/src/goryachev/fx/FxDisconnector.java

Proposal

It might be beneficial to create a class (ListenerHelper, feel free to suggest 
a better name) which:

- provides convenient methods like addChangeListener, addInvalidationListener, 
addWeakChangeListener, etc.
- keeps track of the listeners and the corresponding ObservableValues
- provides a single disconnect() method to remove all the listeners in one go.
- optionally, it should be possible to add a lambda (Runnable) to a group of 
properties
- optionally, there should be a boolean flag to fire the lambda immediately
- strongly suggest implementing an IDisconnectable functional interface with a 
single disconnect() method

Make it Public Later

Initially, I think we could place the new class in package 
com.sun.javafx.scene.control; to be made publicly accessible later.

Where It Will Be Useful

[JDK-8294589](https://bugs.openjdk.org/browse/JDK-8294589) "MenuBarSkin: memory 
leak when changing skin"
and other skins, as a replacement for 
LambdaMultiplePropertyChangeListenerHandler.

https://github.com/openjdk/jfx/pull/908#:~:text=19%20hours%20ago-,8295175%3A%20SplitPaneSkinSkin%3A%20memory%20leak%20when%20changing%20skin%20%23911,-Draft

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

Commit messages:
 - 8294809: use weak reference correctly this time
 - 8294809: tests
 - 8294809: remove
 - 8294809: change listener with callback
 - 8294809: skin base
 - 8294809: whitespace
 - 8294809: event handlers and filters
 - 8294809: cleanup
 - 8294809: override
 - 8294809: null checks
 - ... and 4 more: https://git.openjdk.org/jfx/compare/9768b5e4...af77693c

Changes: https://git.openjdk.org/jfx/pull/908/files
 Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=908&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8294809
  Stats: 1498 lines in 4 files changed: 1495 ins; 2 del; 1 mod
  Patch: https://git.openjdk.org/jfx/pull/908.diff
  Fetch: git fetch https://git.openjdk.org/jfx pull/908/head:pull/908

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

Reply via email to