Skip to content

Commit 4959f1b

Browse files
hjohnkevinrushforth
authored andcommitted
8290331: Binding value left null when immediately revalidated in invalidation listener
Reviewed-by: mstrauss, kcr
1 parent b8302f6 commit 4959f1b

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

modules/javafx.base/src/main/java/javafx/beans/binding/ObjectBinding.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,15 @@ public final void invalidate() {
180180
valid = false;
181181
onInvalidating();
182182
ExpressionHelper.fireValueChangedEvent(helper);
183-
value = null; // clear cached value to avoid hard reference to stale data
183+
184+
/*
185+
* Cached value should be cleared to avoid a strong reference to stale data,
186+
* but only if this binding didn't become valid after firing the event:
187+
*/
188+
189+
if (!valid) {
190+
value = null;
191+
}
184192
}
185193
}
186194

modules/javafx.base/src/test/java/test/javafx/beans/value/LazyObjectBindingTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,24 @@ void shouldBeInvalidInitially() {
5252
assertFalse(binding.isValid());
5353
}
5454

55+
@Test
56+
void invalidationWhichBecomesValidDuringCallbacksShouldReturnCorrectValue() {
57+
LazyObjectBindingStub<String> binding = new LazyObjectBindingStub<>() {
58+
@Override
59+
protected String computeValue() {
60+
return "A";
61+
}
62+
};
63+
64+
binding.addListener(obs -> {
65+
assertEquals("A", binding.get());
66+
});
67+
68+
binding.invalidate(); // becomes valid again immediately
69+
70+
assertEquals("A", binding.get());
71+
}
72+
5573
@Nested
5674
class WhenObservedWithInvalidationListener {
5775
private InvalidationListener invalidationListener = obs -> {};

0 commit comments

Comments
 (0)