On Thu, 13 Jul 2023 01:24:12 GMT, Nir Lisker <nlis...@openjdk.org> wrote:

>> John Hendrikx has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Fix ObservableSubscriptionsTest
>
> modules/javafx.base/src/main/java/javafx/beans/Subscription.java line 33:
> 
>> 31: /**
>> 32:  * A subscription encapsulates how to cancel it without having
>> 33:  * to keep track of how it was created.
> 
> I would like to see some more info here, like what it is and how it's used, 
> and a note on comparison with listeners. Taking a page out of 
> `ChangeListener`, I took a stab at it:
> 
> 
> Executes code on change or invalidation events. A {@code Subscription} can be 
> created by subscribing to invalidation
> events on an {@code Observable} using {@link Observable#subscribe(Runnable)}
> and to change events on an {@code ObsefvableValue} using {@link 
> Observable#subscribe(Consumer)}
> and {@link Observable#subscribe(BiConsumer)}. It can be unsubscribed using 
> {@link #unsuscribe}.
> <p>
> Subscriptions don't block the the {@code Observable} from being garbage 
> collected, and will be collected with
> it (if they are not subscribed on other {@code Observable}s, see below). 
> However, since {@code Observable}s
> blocks their subscriptions from being GC'd, {@code unsuscribe()} must be 
> called if they are to be eligible for
> GC before the {@code Observable} is. Consider creating a derived {@code 
> ObservableValue}
> using {@link #when(ObservableValue)} and subscribing on this derived 
> observable value
> to automatically decouple the lifecycle of the subscriber from the original 
> {@code ObservableValue}
> when some condition holds:
> {@code
> obs.when(cond).subscribe(...)
> }
> <p>
> Subscriptions can also be combined using {@link #combine} and {@link #and}, 
> which allows for
> multiple subscriptions to be unsubscribed together. This is useful when they 
> share the same lifecycle,
> which is usually the case when they are subscribed on the same {@code 
> Observable}.
> <p>
> The same subscriber can be subscribed to multiple {@code Observable}s, 
> including more than once on the
> same {@code Observable}, in which case it will be executed more than once. 
> That is, no uniqueness check is made.
> <p>
> {@code Subscription}s behave similarly to {@link InvalidationListener}s and 
> {@code ChangeListener}s. An
> advantage of {@code Subscription} is that it encapsulates how to cancel it 
> without having to keep track of
> how it was created.
> 
> 
> This will also alleviate some repeated verbosity in the subscribe methods.

I'm not entirely sure about this; the `Subscription` interface is pretty 
neutral in how it can be used, and does not have any direct link to observables 
at all; it's more of a token that you get that can be used to cancel a previous 
action, it doesn't actively do anything (unless you count the wrapper that it 
puts around the provided function).

As it is, they don't even need to be associated with `Observable` or 
`ObservableValue` at all.  Just as easily you could do:

       FileInputStream inputStream = .. ;
       Subscription combined = Subscription.combine(
              property.subscribe(this::invalidated),
              () -> inputStream.close()
       );

       combined.subscribe();  // closes input stream and removes invalidations 
subscriber

Although I think it is a good description, I'm not sure it belongs on this 
class.

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

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

Reply via email to