On Mon, 31 Oct 2022 16:45:51 GMT, Andy Goryachev <ango...@openjdk.org> wrote:

>> 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
>> 
>> https://github.com/openjdk/jfx/pull/914
>
> Andy Goryachev has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   8294809: whitespace

I fully agree with the need for a wider discussion.  Any suggestions for 
changing of names etc. are always welcomed.

The use case for a public ListenerHelper is to provide a convenient way to 
disconnect any listeners when a certain application-level UI (panel, window) is 
closed and gets discarded.  For instance, a financial application might have a 
short-lived popup with a chart, multiple subscriptions to real time data, and 
so on; and there is a single moment when this popup gets closed and discarded.  
In this situation, it is better to disconnect all data subscriptions as well as 
all listeners that has been added to various application components, at that 
exact moment.

For this PR, the goal is not to extend the public API surface and keep things 
as implementation detail.  ChLi and other can be made package private or 
private.

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

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

Reply via email to