Java's Getters And Setters are evil, JavaFX Script's not always
The reaction for the posts Getters and setters: an antipattern. JavaBeans and OO and Summary: Public getters and setters should be considered as an antipattern caused some interesting discussions and comments. There was one common sense: exposing private attributes over getters and setters is neither objectoriented, nor domain driven style. An interesting solution for this problem offers JavaFX script, sample:
A class customer with 2 members and one update method:
import java.lang.System;
class Customer{
private attribute firstName: String?;
private attribute lastName: String?;
operation update(newFirstName:String,newLastName:String);
}
operation Customer.update(newFirstName:String,newLastName:String){
firstName = newFirstName;
lastName = newLastName;
}
The interesting part of the source code are "Replace Trigger" which can be associated with attributes:
trigger on Customer.firstName[oldValue] = newValue{
System.out.println("Old value was: {oldValue}, the new value is: {newValue}");
}
trigger on Customer.lastName[oldValue] = newValue{
System.out.println("Old value was: {oldValue}, the new value is: {newValue}");
}
The construction of an FX object:
var dukeCustomer = Customer{
firstName: "duke"
lastName: "mighty"
};
Causes the following output:
Old value was: , the new value is: duke
Old value was: , the new value is: mighty
The call of the following update method:
dukeCustomer.update('java','javafx');
writes the lines below:
Old value was: duke, the new value is: java
Old value was: mighty, the new value is: javafx
So JavaFX Script allows, only if neccessary, the definition of "interceptors" called triggers, which can be used for validation etc.
I like the idea, because most of the Java-Getters/Setters are empty. I'm curious, why these triggers aren't called "update aspects".
It would be much better for the marketing :-).
The method update isn't necessary, it is also allowed to access the attributes directly. It seem's like JavaFX now ignores the "private" keyword...
Hint: to see the system output from the JavaFXPad, you have to activate the "Java Console" in the JNLP settings (System Settings, Java under Windows).
The getters and setters debate has been raging for awhile now. Not sure where I stand but interesting twise with the JavaFX factor.
Posted by JavaDonkey on June 01, 2007 at 06:52 PM CEST #
Sort of unrelated but I'm also impressed by the integration of database concepts... It's clear the design team around F3/JavaFX (Christopher only?) are well-rounded, in-the-trenches type of people.
Posted by Ivan on June 01, 2007 at 07:12 PM CEST #
I just came here because I read your J1 presentation where you discuss binding JPA objects to UI using 295... I was very surprised to see something like that, have you tried this?
295 requires property change listeners in order to build proper two way binding, that doesn't seem like a good idea to add into a JPA object (PropertyChangeSupport objects). Yet I didn't see any mention of that in the presentation.
Anyway, regarding getters and setters have you seen my bean properties project?
It pretty much addresses most of the issues and I think solves them more elegantly than F3 (arguably the syntax could be improved).
Posted by Shai Almog on June 03, 2007 at 12:21 AM CEST #
Hi Shai,
the problem with J1-presentation is the 1 hour limit :-). I used Eclipse's Beans Binding, my own jakarta commons beanutils based solution and I'm also experimenting with Beans Binding. PropertyChangeSupport stuff is not perfect, but can be easily generated (see Netbeans 6 -> Java Desktop Application). A two-way binding is only needed in case there are more than one view interested in one domain projects. The JavaFX solution surprised me - it is interesting.
I'm already curious about your solution!
thank you for your comment,
adam
Posted by Adam Bien on June 03, 2007 at 11:50 AM CEST #