On Sun, 1 Jan 2023 15:04:17 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:

>> modules/javafx.base/src/main/java/com/sun/javafx/binding/BidirectionalContentBinding.java
>>  line 81:
>> 
>>> 79:         if ((obj1 instanceof ObservableList<?> list1) && (obj2 
>>> instanceof ObservableList<?> list2)) {
>>> 80:             @SuppressWarnings("unchecked")
>>> 81:             final ListContentBinding<Object> binding = new 
>>> ListContentBinding<>((ObservableList<Object>) list1, 
>>> (ObservableList<Object>) list2);
>> 
>> Although the previous code has the same problem, this is sketchy. The two 
>> lists can be of different types while `ListContentBinding` requires the same 
>> type. This is a result of the `Bindings` public API that takes two 
>> `Objects`, so all type information is lost. Is it worth adding a comment 
>> about this since suppressing the warning can be understood as "trust me, 
>> this is fine".
>
> What would go wrong if they're not the same type?  `ListContentBinding` 
> doesn't (and can't) enforce it and doesn't care either way.  The whole 
> function fails silently if types don't match.  Also `ListContentBinding` is a 
> private class and so I'd expect this code to be aware of how it works and 
> what is/isn't safe to do. 
> 
> I personally think this entire class is unfinished.  It fails miserably in 
> edge cases without so much as a warning to the user. Take this for example:
> 
>     public static void main(String[] args) {
>         ObservableList<String> a = FXCollections.observableArrayList();
>         ObservableList<String> b = FXCollections.observableArrayList();
>         Bindings.bindContentBidirectional(a, b);
>         Bindings.bindContentBidirectional(a, b);
>         a.add("A");
>         System.out.println(a + " : " + b);
>     }
> 
> Prints:
> 
>     [A, A, A, A] : [A, A, A]
> 
> No mention about this in the API docs at all.  It breaks even worse when you 
> make circular bindings `[a,b], [b,c], [c,a]` (stack traces get logged to the 
> console complaining about `IndexOutOfBoundsException`).
> 
> I've created a solution that rejects double bindings and circular bindings, 
> but it's a bit out of scope for this.  I think however that it is worth 
> adding, and considering that the current behavior is broken when doing any of 
> such things, not a big API break if instead we throw an exception.

You are right, nothing would go wrong.

I agree that the behavior is undesired and should be fixed in another issue. I 
was thinking of adding more specific overloads that make sense to the public 
API and deprecating the method that takes everything, making it throw.

>> modules/javafx.base/src/main/java/com/sun/javafx/binding/ContentBinding.java 
>> line 89:
>> 
>>> 87:             ListContentBinding<Object> binding = new 
>>> ListContentBinding<>((List<Object>) list1);
>>> 88: 
>>> 89:             list2.removeListener(binding);
>> 
>> Another problem inherited from the existing code. What if the `obj2` is a 
>> `List` and `obj1` is an `ObservableList`? The docs don't say anything about 
>> the order.
>> 
>> Same question as before about adding a comment addressing the case that the 
>> two lists are not of the same type.
>
> Yes, looks like this is quite broken. This wouldn't have gone unnoticed so 
> long if unbind would just throw an exception when nothing could be unbound; 
> silently failing is never a good idea.

Can you file an issue for this if it's not filed already?

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

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

Reply via email to