The internal BidirectionalBinding class implements bidirectional bindings for 
JavaFX properties. The design intent of this class is to provide 
specializations for primitive value types to prevent boxing conversions (cf. 
specializations of the Property class with a similar design intent).

However, the primitive BidirectionalBinding implementations do not meet the 
design goal of preventing boxing conversions, because they implement 
ChangeListener.

ChangeListener is a generic SAM interface, which makes it impossibe to invoke 
an implementation of ChangeListener::changed with a primitive value (i.e. any 
primitive value will be auto-boxed).

The boxing conversion happens, as with all ChangeListeners, at the invocation 
site (for example, in ExpressionHelper). Since the boxing conversion has 
already happened by the time any of the BidirectionalBinding implementations is 
invoked, there's no point in using primitive specializations of 
BidirectionalBinding after the fact.

This issue can be solved by having BidirectionalBinding implement 
InvalidationListener instead, which by itself does not incur a boxing 
conversion. Because bidirectional bindings are eagerly evaluated, the 
observable behavior remains the same.

I've filed a bug report with the same title.

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

Commit messages:
 - BidirectionalBinding uses InvalidationListener to prevent boxing conversions

Changes: https://git.openjdk.java.net/jfx/pull/454/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jfx&pr=454&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8264770
  Stats: 111 lines in 3 files changed: 42 ins; 5 del; 64 mod
  Patch: https://git.openjdk.java.net/jfx/pull/454.diff
  Fetch: git fetch https://git.openjdk.java.net/jfx pull/454/head:pull/454

PR: https://git.openjdk.java.net/jfx/pull/454

Reply via email to