[datum] JavaFX properties support

Brian Goetz brian.goetz at oracle.com
Wed Jan 24 13:54:08 UTC 2018


x() and y().

On 1/24/2018 7:04 AM, Nir Lisker wrote:
> I understand, but your comment about JavaBeans accessor naming 
> conventions made me wonder: in the example in the datum document, the 
> class has a comment "// public read accessors for x and y"; what are 
> these if not getX() and getY()?
>
> On Tue, Jan 23, 2018 at 3:48 AM, Brian Goetz <brian.goetz at oracle.com 
> <mailto:brian.goetz at oracle.com>> wrote:
>
>     Yes, it's too much to ask :)
>
>     You even illustrate part of the reason in your mail -- in alluding
>     to all the complexities you've dropped to "keep the idea simple."
>     But those simplifications never sit still for long.  What is a
>     satisfying simplification for one person's idea of properties is
>     completely unacceptable to someone else -- the range of (mutually
>     incompatible) features that have been described as "properties" is
>     quite broad.
>
>     While I can't blame anyone for hoping that we'll have a solution
>     for properties while we're at it, it's definitely way outside of
>     the scope of what we're trying to do with data classes (which is
>     already hard enough.)  And we're definitely not interested in
>     burning (questionable) API design conventions into the language,
>     like the JavaBeans accessor naming conventions.
>
>     Sorry,
>     -Brian
>
>
>
>
>     On 1/22/2018 7:18 PM, Nir Lisker wrote:
>
>         Hello,
>
>         Iv'e read the summary on datum[1] and read some previous
>         discussion on this
>         list, but haven't downloaded and used it myself. I'd like to
>         open a can of
>         worms by bringing up the issue of boilerplate in JavaFX
>         properties (I will
>         use FXP to distinguish from the usual use of "property").
>
>         An FXP is defined as shown in [2] in example 1-1. The
>         definition requires:
>         1. declaration (and initialization)
>         2. getter for the property
>         3. getter for the property value (which is a delegate to the
>         internal
>         getter of the property)
>         4. setter, same as 3
>
>         When there are several properties a lot of boilerplate is
>         created, as
>         demonstrated in the Line class[3] lines 130-276 (though the
>         initialization
>         there is more elaborate than a SimpleXxxProperty constructor).
>
>
>         IF datum does the following:
>
>         __data class Point(IntegerWrapper x, IntegerWrapper y) { }
>
>         desugars to
>
>         final class Point extends java.lang.DataClass {
>              final IntegerWrapper x;
>              final IntegerWrapper y;
>
>              public Point(IntegerWrapper x, IntegerWrapper y) {
>                  this.x = x;
>                  this.y = y;
>              }
>
>              public IntegerWrapper getX() {
>                  return x;
>              }
>              // same for y
>
>              // all the other stuff
>         }
>
>         then maybe it's not too much to ask for something along the
>         lines of:
>
>         __data class Point(IntegerProperty x, IntegerProperty y) { }
>
>         desugars to
>
>         final class Point extends java.lang.DataClass {
>              final IntegerProperty x;
>              final IntegerProperty y;
>
>              public Point(IntegerProperty x, IntegerProperty y) {
>                  this.x = x;
>                  this.y = y;
>              }
>
>              // the name of the getter of the field changes according
>         to specs
>              public IntegerProperty xProperty() {
>                  return x;
>              }
>
>              // new method for value getter
>              public int getX() {
>                  return x.get();
>              }
>
>              // new method for value setter
>              public void setX(int xValue) {
>                  x.set(xValue);
>              }
>
>              // same for y
>
>              // all the other stuff
>         }
>
>         To keep the idea simple, Iv'e dropped the discussion about
>         finality,
>         un/boxing, explicit "overriding" of auto-generated code etc.
>
>         I'd like to note 2 things:
>
>         1. FXP already have a sort of elevated status in the JavaDoc
>         and its
>         generation tool: the doc is written only on the field and is
>         "attached" to
>         the other methods on generation, and there is a special
>         properties section
>         for them in the resulting doc.
>         I'm mentioning this as a precedent for FXP being treated
>         differently. I
>         believe they represent a "data carrier type" of their own with
>         ideas of a
>         reactive paradigm - listeners and bindings. Since datum is
>         actually trying
>         to solve a problem of "data carrier type" (though above I used the
>         boilerplate hook) I believe this is the place to address the
>         FXP issue. I
>         even believe they should be a lower level construct, but this
>         is out of
>         scope.
>
>         2. At the risk of being crucified, I'll mention that Lombok
>         has had some
>         requests and discussions on this. I'm mentioning it as a
>         source that there
>         is an audience for this support.
>
>
>         [1]http://cr.openjdk.java.net/~briangoetz/amber/datum.html
>         <http://cr.openjdk.java.net/%7Ebriangoetz/amber/datum.html>
>         [2]
>         https://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm
>         <https://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm>
>         [3]
>         http://hg.openjdk.java.net/openjfx/jfx-dev/rt/file/a455aff48e48/modules/javafx.graphics/src/main/java/javafx/scene/shape/Line.java
>         <http://hg.openjdk.java.net/openjfx/jfx-dev/rt/file/a455aff48e48/modules/javafx.graphics/src/main/java/javafx/scene/shape/Line.java>
>
>
>         - Nir
>
>
>



More information about the amber-dev mailing list