Discussion: Naming API method

John Hendrikx john.hendrikx at gmail.com
Mon Nov 14 14:52:58 UTC 2022


Hi,

I'm working on https://github.com/openjdk/jfx/pull/830 where I asked for 
some opinions on the naming of a new method I'd like to introduce in 
ObservableValue.

I wrote a (perhaps too large) comment about the possible names and 
rationales: https://github.com/openjdk/jfx/pull/830#issuecomment-1304846220

I'd like to ask what others think what would be a good name for this new 
method (Observable#when in the PR) in order to move the PR forward, as I 
think it offers a very compelling feature to JavaFX (moving from weak 
reference to deterministic behavior when it comes to listener 
management).  My opinion has always been that using weak listeners for 
listener management is a crutch that relies far too much on the internal 
workings of the JVM and Garbage Collector which offer no guarantees as 
to the timely clean up of these references and the listeners related to 
them.

Leading contenders are (but not limited to these, if you have a better 
name):

1) conditionOn

2) updateWhen

3) when

4) whenever

Usage in code is nearly always going to be something like these constructs:

       // keeps text property in sync with longLivedProperty when label 
is shown:
label.textProperty().bind(longLivedProperty.**when**(label::isShownProperty));

       // keeps text property in sync with longLivedProperty when 
container is shown:
label.textProperty().bind(longLivedProperty.**when**(container::isShownProperty)); 


It can also be used to make a listener only actively listen when a 
condition is met (the listener is added/removed immediately when the 
condition changes, facilitating GC):

       // listen to changes of longLivedProperty when container is shown:
       longLivedProperty.when(container::isShownProperty)
             .addListener((obs, old, current) -> { ... change listener 
... });

Or it can be used to disable updates temporarily (or permanently):

         BooleanProperty allowUpdates = new SimpleBooleanProperty(true)

         // keeps text property in sync when updates are allowed:
         name.textProperty().bind(model.title.when(allowUpdates));
detail.textProperty().bind(model.subtitle.when(allowUpdates));
asyncImageProperty.imageHandleProperty().bind(model.imageHandle.when(allowUpdates));

This last example can be useful in Skin#dispose, but has uses outside of 
skins as well, for example when you want to prevent updates until things 
have settled down.

Thanks for reading!

--John




More information about the openjfx-dev mailing list