Wzorzec właściwości JavaFX ma na celu rozszerzenie starego, standardowego wzorca JavaBeans. Tak więc w twoim przykładzie, zgodnie z konwencją JavaBean, masz właściwość (do odczytu i zapisu) typu double
o nazwie amount
. Określone jest to za pomocą dwóch metod
public double getAmount() ;
public void setAmount(double amount);
Wzór JavaBeans umożliwia pewne ograniczone „obserwowanie” poprzez „właściwości związany”, w których ziarna wspierają rejestracji PropertyChangeListener
. Zestaw narzędzi interfejsu użytkownika często musi obserwować właściwości i reagować na zmiany. Na przykład sensowne jest, aby Label
miał właściwość text
. Jeśli zmieni się właściwość text
, należy powiadomić o numerze Label
, aby wiedział, że jest odświeżany. Na pierwszy rzut oka zastosowanie tego może mieć JavaBeans z właściwymi właściwościami. Jednak użycie tego mechanizmu w zestawie narzędzi interfejsu użytkownika powoduje problemy z wydajnością, ponieważ nie ma możliwości powiadomienia, że wartość nie jest już ważna bez natychmiastowego obliczenia. Oznacza to na przykład, że układ będzie przeliczony na każdą indywidualną zmianę właściwości.
Co zespół JavaFX najwyraźniej dążyły do zrobienia było określić wzorzec, który
- odpowiadało standardowej JavaBeans wzór i
- obsługiwane właściwości obserwowalne gdzie unieważnienie może być śledzone bez ponowne obliczanie Wartości zależne za każdym razem wartość zmieniła („wartości leniwie obserwowalne”)
więc rozwiązanie JavaFX jest stworzenie właściwości, które obsługują zarówno ChangeListener
S, który jest powiadamiany o zmiany wartości, a InvalidationListener
s, które są powiadamiane, gdy wartość nie jest już ważna. Oznacza to, że na przykład mechanizm układu może śledzić, czy jest on aktualnie prawidłowy, bez wymuszania ponownego obliczania, gdy stanie się on nieprawidłowy. Układ zostanie przeliczony tylko na rzeczywistym impulsu ekranu (to znaczy, gdy scena jest renderowana) i tylko wtedy, gdy jest nieważny.
(Jako proof-of-concept szybki, należy rozważyć następujące kwestie:
DoubleProperty width = new SimpleDoubleProperty(3);
DoubleProperty height = new SimpleDoubleProperty(4);
ObservableDoubleValue area = Bindings.createDoubleBinding(() -> {
double a = width.get() * height.get();
System.out.println("Computed area: "+a);
return a ;
}, width, height);
System.out.println("Area is "+area.getValue());
width.set(2);
height.set(3);
System.out.println("Area is "+area.getValue());
tu zauważyć, że wartość pośrednia, kiedy width
jest 2 i height
jest nadal 4, nigdy nie jest obliczana.)
Więc wartości w JavaFX są reprezentowane przez te obserwowalne Properties
, które obsługują zarówno detektory unieważniania, jak i zmieniają detektory, co oznacza, że są w zasadzie "leniwie obserwowalne". Odsłanianie samej właściwości za pomocą metody dostępu do właściwości (amountProperty()
w twoim przykładzie) wystarcza do obsługi tej funkcji.
Jednak w wyniku semantyki oznaczenie DoubleProperty
oznacza, że ziarno ma wartość typu double
. Aby zachować zgodność ze starą konwencją JavaBeans, komponent bean powinien zareklamować ten fakt, ujawniając odpowiednie metody. W związku z tym wzorzec właściwości JavaFX wymaga zarówno "akcesora właściwości" (amountProperty()
), jak i standardowych metod JavaBeans (getAmount()
i setAmount(...)
). Oznacza to, że komponenty bean zgodne ze wzorcem JavaFX mogą być używane wszędzie tam, gdzie używany jest standardowy wzorzec JavaBeans, na przykład w JPA.
Należy pamiętać, że aby wzór działał poprawnie, zawsze powinno być prawdą, że amountProperty().get() == getAmount()
i że amountProperty().set(x)
ma taki sam efekt jak setAmount(x)
. Jest to gwarantowane (nawet jeśli klasa komponentu bean jest z podklasą), wykonując metody get
i set
, jak w twoim przykładzie.
Jeśli samodzielnie przywołujesz metody pobierania lub zmiany wartości nieruchomości, nie ma znaczenia, do kogo zadzwonisz, ponieważ gwarantują one ten sam efekt. Ponieważ wzorzec JavaFX Property jest rozszerzeniem wzorca JavaBean, może występować niewielka preferencja dla wywoływania metod get
i set
: w pewnym sensie uzyskiwanie dostępu do wartości wymaga tylko funkcji JavaBeans, a nie pełnej funkcjonalności właściwości JavaFX, więc może uczynić semantyczny sens, aby polegać tylko na tej funkcjonalności. W praktyce jednak nie ma różnicy, której używasz.
od [dowiedz się ebook javafx] (http://www.apress.com/9781484211434). 'Dodatkowe moduły pobierające i ustawiające, wykorzystujące konwencję nazewnictwa JavaBeans, są dodawane w celu zapewnienia współdziałania klasy ze starszymi narzędziami i strukturami, które używają starych konwencji nazewnictwa JavaBeans do identyfikowania właściwości klasy. ' – Kachna
Moim zdaniem dodatkowe pobierające i ustawiające nie są wymagane. – Kachna
@Kachna Z pewnością to zależy od twojego przypadku użycia. Np. Jeśli chcesz używać właściwości JavaFX w jednostce JPA, potrzebujesz metod get i set. Podobnie, jeśli używasz zestawiania JSON lub XML, itp. –