2012-09-21 14 views
5

Dla kogoś stosunkowo nowego w ekosystemie Java, istnieje dość lekki sposób na to, jakie struktury, takie jak Qt i Django, robią z ich systemem sygnalizacji/odbiornika, gdzie komponenty mogą powiedzieć "Robię coś ", a inne komponenty radzą sobie z tym w dość luźny sposób?Java - mechanizm sygnału/slotów

Przepraszam z góry, jeśli to pytanie nie przejdzie testu "pojedynczej obiektywnej odpowiedzi".

Edytuj: Aby dodać nieco więcej kontekstu, jest to związane z warstwą aplikacji opartą na bazie danych dla usługi WWW. Niektóre zasoby, gdy są utrwalone, muszą również zapisać rekord kontroli zawierający dodatkowe informacje kontekstowe. W Django zrobię to za pomocą mechanizmu sygnalizacji lub użyję jednej z kilku istniejących bibliotek, które właśnie to robią. W przypadku programu Scala zrobiłem swoje własne, hackowe rzeczy za pomocą funkcji wywołania zwrotnego, ale jest to łatwiejsze dzięki funkcjom pierwszej klasy. Nie mam wątpliwości, że struktury takie jak Swing zapewniają udogodnienia dla tego rodzaju rzeczy, ale jestem (być może w nieuzasadniony sposób) przekonany o dodaniu takiej zależności do tego, co obecnie jest dość aplikacją wanilii (nie, że Django nie jest sam w sobie ogromna zależność od Pythona z wanilii!)

+0

mówisz [modeli zdarzeniami] (http://en.wikibooks.org/wiki/Java_Programming/Event_Handling)? – jefflunt

+3

Na poziomie od średnich do ogromnych komponentów, gdzie masz interfejsy implementujące 2 lub więcej metod, myślę, że Dependency Injection wygrał bitwę o łączenie komponentów. Na małym poziomie (jak na przykład akcja na przycisk GUI) wzorzec Listener jest królem. –

+0

@normalocity: tak, ale nie bezpośrednio związane z programowaniem GUI. – Mikesname

Odpowiedz

3

W Javie, przynajmniej po stronie interfejsu użytkownika, zwykle robi się to przy pomocy listener approach: rejestrujesz metodę detektora wywoływaną w przypadku wystąpienia określonych zdarzeń. Może być nieco mniej luźno sprzężony niż mechanizm sygnału/szczeliny Qt ... Innym rozwiązaniem, które można rozważyć, jest Java message service, która jest specjalnie zaprojektowana do luźno sprzężonej komunikacji w systemach klient/serwer w oparciu o standard Java EE.

+1

Prawda.Ale czasami nawet używanie anonimowych klas jest wciąż zbyt dużą strukturą. Jednak QtJambi (struktura Qt zaimplementowana w Javie) używa Reflection, aby zapewnić szczeliny sygnałów i wyniki IMHO w niższej liczbie linii i klarowniejszym kodzie, ale traci bezpieczeństwo typu. –

2

Zgadzam się z pozostałymi komentarzami/odpowiedziami dotyczącymi programowania sterowanego zdarzeniami.

Możesz być zainteresowany http://eventbus.org. Pozwala to na globalne rozgłaszanie/odbieranie wydarzeń bez konieczności jawnego rejestrowania słuchaczy u każdego producenta zdarzeń.

0

W klasie, w której chcesz odbierać sygnał, można zdefiniować Broadcastreceiver:

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     updateUI(); 
    } 
}; 

@Override 
public void onPause() { 
    super.onPause(); 
    getActivity().unregisterReceiver(broadcastReceiver); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    getActivity().registerReceiver(broadcastReceiver, new IntentFilter(Constants.ACTION_UPDATE_PROFILE_UI)); // the constant is to identify the type of signal, it can be any string you want 
} 

Następnie w klasie, w której chcesz wysłać sygnał, po prostu zrobić:

Intent signalIntent = new Intent(Constants.ACTION_UPDATE_PROFILE_UI); 

dodać typ danych, które chcesz zamiarem a następnie transmitowane to lubią:

sendBroadcast(signalIntent); 

ty ca n znaleźć przykładową aplikację tutaj:

https://github.com/nickfox/Update-Android-UI-from-a-Service

3

Jeśli szukasz biblioteki Java, który zapewnia mechanizm sygnał/gniazda podobnego do Qt to należy spojrzeć na sig4j. Jest bezpieczny dla wątków, bezpieczny dla typów i obsługuje różne typy połączeń.

Uwaga: Jestem autorem tej biblioteki :)