On Sun, 9 Jul 2023 18:48:16 GMT, Jose Pereda <jper...@openjdk.org> wrote:

>> John Hendrikx has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Add newline at end of ConditionalBinding file
>
> modules/javafx.base/src/main/java/javafx/beans/Observable.java line 110:
> 
>> 108:     default Subscription subscribe(Runnable subscriber) {
>> 109:         Objects.requireNonNull(subscriber, "subscriber cannot be null");
>> 110:         InvalidationListener listener = obs -> subscriber.run();
> 
> InvalidationListeners are widely used in this pattern:
> 
> 
> javaFXProperty.addListener(new InvalidationListener() {
>             @Override
>             public void invalidated(Observable observable) {
>                 if (value.get() != null) {
>                     // do something
>                     javaFXProperty.removeListener(this);
>                 }
>             }
>         });
> 
> 
> Does subscribe/unsubscribe allows something like this?

The new `subscribe` methods don't support this usage, but they're also not 
intended to replace the old methods.  Cases like the one you show above, but 
also cases where a single listener is registered on many properties still are 
best handled using the `addListener`/`removeListener` methods.  I consider them 
more advanced usage which you are more likely to encounter in the internals of 
JavaFX or libraries.

I don't see this pattern that often though, but I know it exists as removing 
listeners during notification is something that `ExpressionHelper` specifically 
needs to deal with (also see https://github.com/openjdk/jfx/pull/1081 where I'm 
advocating for a better `ExpressionHelper` that provides correct old values 
when dealing with nested notifications and listener list changes).

I suppose you could still do this in a hacky way:

      private Subscription subscription;

      {
           subscription = property.subscribe(() -> {
                 if (condition) {
                     this.subscription.unsubscribe();
                 }
           });
      }

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

PR Review Comment: https://git.openjdk.org/jfx/pull/1069#discussion_r1257538675

Reply via email to