1 kwietnia
13:40 2009
"Throwable Events" to stosunkowo nowa technika obsługi zdarzeń w języku Java, która może służyć jako zamiennik starego i niewygodnego systemu "listenerów". Główną zaletą jest większa przejrzystość kodu (nie trzeba dodawać setek addFooListener), oraz łatwość implementacji w programach korzystających z wielu wątków.
Przykładowa implementacja
Klasa Button:
public class Button extends JButton {
public Button(String text) {
super(text);
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
throw new ClickEvent(e.getSource());
}
} );
}
}
Klasa ClickEvent:
public class ClickEvent extends RuntimeException {
private Object source;
public ClickEvent(Object source) {
this.source = source;
}
public Object getSource() { return source; }
}
Przykład użycia
public class Main extends JFrame implements Thread.UncaughtExceptionHandler {
Main() {
super("Test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Thread.setDefaultUncaughtExceptionHandler(this);
Button helloButton = new Button("Hello");
add(helloButton, BorderLayout.NORTH);
Button helloButton2 = new Button("Hello 2");
add(helloButton2, BorderLayout.SOUTH);
pack();
setVisible(true);
}
public void uncaughtException(Thread t, Throwable e) {
if (e instanceof ClickEvent) {
ClickEvent ce = (ClickEvent)e;
if (ce.getSource() instanceof Button) {
System.out.println("Button Clicked: " + ce.getSource());
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { public void run() { new Main(); } } );
}
}
Proszę o komentarz
Zawsze podziwiałem javowców za cierpliwość do nazw funkcji takich jak setDefaultUncaughtExceptionHandler. Choć ZTCW to oni głównie z IDE różnych korzystają.
Ano. W praktyce wygląda to tak, że IDE jako nazwę pola zaproponuje coś bazującego na nazwie typu, potem automatycznie wygeneruje settery/gettery (albo przynajmniej zaproponuje odpowiednie nazwy w oparciu o nazwę pola), no a przy pisaniu kodu co i rusz naciska się kombinację wywołującą „inteligentne dopełnianie”. W praktyce wystarczy pewnie potem wpisać „setDe” i odpalić dopełnianie.
No i nazwy w formacie CamelCase mogą często być rozwijane ze skrótów, np. „setDUEH”.
W Vimie by się to zupełnie nie sprawdzało, do tego języka trzeba mieć dobre IDE.
Swoją drogą wpis pokazuje miły antywzorzec, bardzo podobny do mojego ulubionego „zwracania wartości przez rzucenie wyjątku” :)
„Swoją drogą wpis pokazuje miły antywzorzec, bardzo podobny do mojego ulubionego „zwracania wartości przez rzucenie wyjątku” :)”
O tak, to ostatnio mój ulubiony. Zastosowałem w prototypie funkcji, ale na szczęście usunąłem w rewizji 0.2 ;p
Swoją drogą, jakoś do mnie nie przemawiają Throwable Events – ostatnio zacząłem bawić się AS3, a jak wiadomo on dużo z Javy bierze, i zwykłe dispatchEvent mi na razie wystarcza.
To jakiś żart prima-aprilisowy, prawda?
Nie, to Java. Ona cała jest prima-aprilisowym żartem ;)
Naprawdę ciężko uwierzyć, że to nie jest jakiś smutny żart…
Pozostaje tylko throw new Up();
;)
Oczywiście to był żart – chyba nawet zbyt poważny, bo prawie sam w to uwierzyłem ;)
Co nie zmienia faktu, że setDefaultUncaughtExceptionHandler jest prawdziwe ;>.