Quindi sono davvero seccato che Java non supporti le proprietà di C #. Ho provato un sacco di cose per emulare questo comportamento e questo è il migliore che ho trovato:
import javafx.beans.property.*;
//immutable class (ReadOnlyProperties are ugly to create)
class Person {
public final ReadOnlyStringProperty name;
private final ReadOnlyIntegerWrapper ageWrapper = new ReadOnlyIntegerWrapper(0);
public final ReadOnlyIntegerProperty age = ageWrapper.getReadOnlyProperty();
public Person(String name) {
this.name = new ReadOnlyStringWrapper(name).getReadOnlyProperty();
}
}
//mutable class with field that overrides a setter (really concise)
class Squarer {
public final DoubleProperty somethingSquared = new SimpleDoubleProperty() {
public void set(double value) { super.set(value * value); }
};
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Peter");
System.out.println(p.name.get()); // Peter
System.out.println(p.age.get()); // 0
Squarer s = new Squarer();
s.somethingSquared.set(5);
System.out.println(s.somethingSquared.get()); // 25.0
}
}
Sto usando Proprietà JavaFX per inscatolare tutto campi di istanza. Tutte le proprietà sono public final
in modo che siano immutabili e puoi accedervi con someProperty.get()
anziché getSomeProperty()
.
Se vuoi avere un getter / setter personalizzato, puoi semplicemente ignorarli in modo anonimo come ho fatto sopra. Questo ha il vantaggio che l'implementazione è vicina alla proprietà in ogni momento.
Un buon effetto collaterale è che puoi sempre associare le proprietà. Ad esempio, puoi associare la proprietà age a un calendario e aggiornare la sua età di conseguenza.
Mi piace molto questo approccio, perché non devi scrivere getter e setter che riempiono la tua classe nel caso in cui tu voglia cambiare l'implementazione a un certo punto.
L'ho già usato nei miei progetti personali con grande successo e sto giocando con il pensiero per usarlo in progetti reali al lavoro, ma prima di farlo voglio essere sicuro che non ci siano aspetti negativi.
Vedi qualche aspetto negativo (oltre alle prestazioni)?
Mi piacerebbe che fosse il nuovo standard al lavoro.