On Tue, 22 Nov 2022 20:22:06 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 with a new target base due to a > merge or a rebase. The incremental webrev excludes the unrelated changes > brought in by the merge/rebase. The pull request contains 28 additional > commits since the last revision: > > - Merge remote-tracking branch 'origin/master' into 8294809.listener.helper > - 8294809: review comments > - 8294809: review comments > - Merge remote-tracking branch 'origin/master' into 8294809.listener.helper > - 8294809: review comments > - Merge remote-tracking branch 'origin/master' into 8294809.listener.helper > - 8294809: whitespace > - 8294809: no public api > - 8294809: map change listener > - Merge remote-tracking branch 'origin/master' into 8294809.listener.helper > - ... and 18 more: https://git.openjdk.org/jfx/compare/4f11de10...00566eda This looks ready to go in. I left a few minor comments and questions, but I am approving it as is. modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ListenerHelper.java line 79: > 77: private static Function<SkinBase<?>,ListenerHelper> accessor; > 78: > 79: public ListenerHelper(Object owner) { I note that this is unused, other than in unit tests. modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ListenerHelper.java line 94: > 92: } > 93: > 94: public IDisconnectable addDisconnectable(Runnable r) { I note that this is unused, other than in unit tests. modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/ListenerHelper.java line 114: > 112: } > 113: > 114: protected boolean isAliveOrDisconnect() { Minor: could be private modules/javafx.controls/src/test/java/test/javafx/scene/control/TestListenerHelper.java line 278: > 276: > 277: @Test > 278: public void testInvalidationListener_Callback() { Minor: This test is redundant, and the name of the test method is misleading. Unlike `addChangeListener`, which really does have two similar flavors -- one taking a `ChangeListener` and one taking a `Consumer`, there isn't a flavor of `addInvalidationListener` that takes a Consumer, so this test method is testing the same method (same signature) as `testInvalidationListener_Plain`. modules/javafx.controls/src/test/java/test/javafx/scene/control/TestListenerHelper.java line 295: > 293: > 294: @Test > 295: public void testInvalidationListener_Callback_FireImmediately() { Minor: redundant (tests the same method signature as `testInvalidationListener_Plain_FireImmediately`. ------------- Marked as reviewed by kcr (Lead). PR: https://git.openjdk.org/jfx/pull/908