JavaBeans

Z Wikipedii, wolnej encyklopedii

JavaBeans — mechanizm komponentów wielokrotnego użytku dla platformy Java opracowany w latach 90. przez firmę Sun Microsystems. Pozwalają opakować wiele małych obiektów w jeden obiekt zwany ziarnem (ang. bean), przestrzegający ściśle określonych konwencji, który może być przenoszony i używany w różnych miejscach aplikacji. Każde ziarno to serializowalny obiekt z bezargumentowym konstruktorem, do którego właściwości można dostać się przy pomocy metod dostępowych.

JavaBeans nie powinny być mylone z Enterprise JavaBeans, architekturą komponentową dla aplikacji rozproszonych, która mimo pewnych podobieństw realizuje inne zadania.

Konwencje[edytuj | edytuj kod]

Klasa obiektu ziarna nie jest wyróżniona w kodzie przez żaden specjalny znacznik. Wyróżniana jest ona na podstawie tego czy przestrzega ściśle określonych konwencji, które pozwalają na manipulację ziarnem innym partiom kodu oraz zewnętrznym narzędziom do wizualnego budowania oprogramowania. W każdym ziarnie możemy wyróżnić:

Dodatkowo, obiekt ziarna musi być serializowalny oraz posiadać bezargumentowy konstruktor.

Właściwości[edytuj | edytuj kod]

Właściwość to prywatne pole obiektu ziarna, do którego dostęp jest kontrolowany przez metody dostępowe. Zakładając, że pole nosi nazwę foo, obie metody muszą nosić nazwy getFoo() oraz setFoo(). Dla pól logicznych dopuszczalne jest stosowanie nazw isFoo() oraz setFoo(). Poniższy przykład demonstruje komponent z dwiema właściwościami:

class Foo implements Serializable {
   private int bar;
   private boolean joe;

   public Foo() {
   }

   public int getBar() {
      return this.bar;
   }

   public void setBar(int value) {
      this.bar = value;
   }

   public boolean isJoe() {
      return this.joe;
   }

   public void setJoe(boolean value) {
      this.joe = value;
   }
}

Wizualne narzędzia budowy kodu udostępniane przez wiele zintegrowanych środowisk programistycznych potrafią rozpoznać właściwości i umożliwić manipulację ich wartościami przy pomocy edytora właściwości obiektu.

Zdarzenia[edytuj | edytuj kod]

Ziarno może generować różne zdarzenia, które mogą być przechwycone i obsłużone przez inne składniki aplikacji. Dzięki zdarzeniom możliwe jest nieinwazyjne wiązanie komponentów ze sobą. Zdarzenie foo tworzone jest poprzez:

  1. utworzenie interfejsu zdarzenia FooListener rozszerzającego interfejs java.util.EventListener,
  2. dodanie metod addFooEventListener() oraz removeFooEventListener(), które pozwalają rejestrować i usuwać procedury obsługi zdarzenia.

Specyfikacja nie precyzuje, w jaki sposób komponent odpala zdarzenie. Operacja ta może, ale nie musi być udostępniona na zewnątrz ziarna. Jeśli komponent reprezentuje kontrolkę graficznego interfejsu użytkownika, wygenerowanym zdarzeniem może być np. kliknięcie w kontrolkę. Tworząc obiekt implementujący wymieniony wyżej interfejs, możemy dodać do kontrolki własny kod obsługi kliknięcia.

import java.util.EventListener;
import java.util.List;
import java.util.LinkedList;

class SomeControl implements Serializable {
   private List<FooListener> fooListeners;

   public SomeControl() {
      this.fooListeners = new LinkedList<>();
   }

   public void addFooEventListener(FooListener listener) {
      this.fooListeners.add(listener);
   }

   public void removeFooEventListener(FooListener listener) {
      this.fooListeners.remove(listener);
   }

   public static interface FooListener extends EventListener {
      public void processFoo();
   }
}

Wizualne narzędzia budowy kodu potrafią rozpoznawać zdarzenia obsługiwane przez ziarno i udostępniać kreatory obiektów odpowiedzi.

Metody[edytuj | edytuj kod]

Wszystkie pozostałe metody obiektu ziarna są traktowane jako operacje, które programista może wykonywać na komponencie. Nie ma tutaj żadnej konwencji, ani ograniczeń co do ich formy, roli i działania.

Dodatkowe interfejsy programistyczne[edytuj | edytuj kod]

Choć ziarno można utworzyć jedynie poprzez przestrzeganie określonych konwencji nazewniczych, środowisko programistyczne udostępnia także dodatkowe, opcjonalne interfejsy oraz klasy pomocnicze. Pozwalają one na zaimplementowanie semantyki, której nie da się wyrazić poprzez odpowiednią strukturę kodu. Przykładem takiej semantyki jest zawężenie zbioru dopuszczalnych wartości dla właściwości, np. do przedziału liczb z zakresu 0-10, którego nie da się wyrazić typami prostymi. W metodzie setProperty() można dodać kod sprawdzania zakresu, który ma prawo rzucić wyjątek PropertyVetoException blokujący zmianę właściwości, jeśli argument będzie mniejszy od 0 lub większy niż 10. Zmianę określonych właściwości można też blokować wybranym procedurom obsługi zdarzeń.

Innym kierunkiem rozszerzania ziaren jest wykorzystanie interfejsów takich, jak PropertyEditor, które mogą być wykorzystane przez wizualne narzędzia budowy kodu do pobierania dodatkowych informacji o komponencie. Przykładowo, wymieniony w poprzednim zdaniu interfejs pozwala na zmianę sposobu prezentacji i obsługi właściwości w edytorze właściwości. Jeśli dana właściwość przyjmuje zakres wartości z określonego podzbioru, zamiast pola tekstowego, wygodniej byłoby wybierać jej wartość z listy.

Zastosowanie[edytuj | edytuj kod]

Głównym obszarem zastosowań komponentów JavaBeans są biblioteki tworzenia graficznego interfejsu użytkownika. Ziarnami JavaBeans są wszystkie kontrolki GUI w pakietach AWT, Swing oraz SWT.

Linki zewnętrzne[edytuj | edytuj kod]