Zaloguj się
Projekty Kategorie Archiwum

"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

Środa 1 kwietnia, 2009 14:37

Zawsze podziwiałem javowców za cierpliwość do nazw funkcji takich jak setDefaultUncaughtExceptionHandler. Choć ZTCW to oni głównie z IDE różnych korzystają.

Hoppke
Środa 1 kwietnia, 2009 15:10

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” :)

BTM
Środa 1 kwietnia, 2009 16:18

„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.

Środa 1 kwietnia, 2009 17:18

To jakiś żart prima-aprilisowy, prawda?

Środa 1 kwietnia, 2009 17:22

Nie, to Java. Ona cała jest prima-aprilisowym żartem ;)

Środa 1 kwietnia, 2009 17:27

Naprawdę ciężko uwierzyć, że to nie jest jakiś smutny żart…

Środa 1 kwietnia, 2009 20:18

Pozostaje tylko throw new Up();
;)

Czwartek 2 kwietnia, 2009 12:25

Oczywiście to był żart – chyba nawet zbyt poważny, bo prawie sam w to uwierzyłem ;)

Czwartek 2 kwietnia, 2009 17:56

Co nie zmienia faktu, że setDefaultUncaughtExceptionHandler jest prawdziwe ;>.

Napisz komentarz

Dodaj komentarz

Formatowanie komentarza

Kategorie

Ewolucja Internetu 8 | Fail 40 | Gry 46 | Humor 129 | Idiotyzm 50 | Java 110 | KDE 85 | KShutDown 22 | Linux 84 | Makagiga 58 Muzeum 3 | Ogólne 819 | Polityka 76 | Programowanie 51 | Reklamy 4 | Techblog 19 | Teorie Spiskowe 12 | TV 59 | UI 9 | Użyteczność 30 | WWW 90 | Wyrwane z Kontekstu 34 | X Files 14

Archiwum

Maj 2012 | Kwiecień 2012 | Marzec 2012 | Luty 2012 | Styczeń 2012 | Grudzień 2011 | Listopad 2011 | Październik 2011 | Wrzesień 2011 | Sierpień 2011 | Lipiec 2011 | Czerwiec 2011 | Maj 2011 | Kwiecień 2011 | Styczeń 2011 | Listopad 2010 | Październik 2010 | Wrzesień 2010 | Sierpień 2010 | Lipiec 2010 | Czerwiec 2010 | Kwiecień 2010 | Marzec 2010 | Luty 2010 | Styczeń 2010 | Grudzień 2009 | Listopad 2009 | Październik 2009 | Wrzesień 2009 | Sierpień 2009 | Lipiec 2009 | Czerwiec 2009 | Maj 2009 | Kwiecień 2009 | Marzec 2009 | Styczeń 2009 | Grudzień 2008 | Listopad 2008 | Październik 2008 | Wrzesień 2008 | Sierpień 2008 | Lipiec 2008 | Czerwiec 2008 | Maj 2008 | Kwiecień 2008 | Marzec 2008 | Luty 2008 | Styczeń 2008 | Grudzień 2007 | Listopad 2007 | Październik 2007 | Wrzesień 2007 | Sierpień 2007 | Lipiec 2007 | Czerwiec 2007 | Maj 2007 | Kwiecień 2007 | Marzec 2007 | Luty 2007 | Styczeń 2007 | Grudzień 2006 | Listopad 2006 | Październik 2006 | Wrzesień 2006 | Sierpień 2006 | Lipiec 2006 | Czerwiec 2006 | Maj 2006 | Kwiecień 2006 | Marzec 2006 | Luty 2006 | Styczeń 2006 | Grudzień 2005 | Listopad 2005 | Październik 2005 | Wrzesień 2005 | Sierpień 2005 | Lipiec 2005 | Czerwiec 2005 | Maj 2005 | Kwiecień 2005 | Marzec 2005 | Luty 2005 | Styczeń 2005