Ho riflettuto per un paio d'anni sull'utilizzo degli eventi Throwable
e sull'implementazione di una sorta di sistema di eventi che utilizza throw
per inviare un evento, o lasciare che un metodo diverso lo gestisca con throws
.
L'unico problema è che Throwable
è riservato per errori ed eccezioni. Una ricerca su google mostra risultati zero (rilevanti) su qualcosa di simile. Presumo che questo sia completamente originale o in minoranza dei sistemi di eventi là fuori.
So che il sistema di eventi C # è simile alla mia idea (anche se non l'ho mai usato, ho visto solo frammenti di codice).
La domanda qui è che sarebbe abusivo creare un sistema di eventi che utilizzi le dichiarazioni try-catch e i throwables, che sono fatti apposta per la gestione degli errori? E ci sarebbero problemi di prestazioni rispetto a un'interfaccia "vanilla": listener con sistema di eventi event-event?
In ogni caso, probabilmente creerò un sistema di eventi usando questa idea solo per provarlo (un piccolo esercizio).
Ho fatto due esempi. Uno dei quali utilizza il sistema di eventi "vanilla", l'altro utilizza Throwables.
Vanilla :
public class Entity implements EntityListener {
@Override
public void entityEvent(EntityEvent e) {
//...
}
}
public interface EntityListener {
public void entityEvent(EntityEvent e);
}
public static void main(String... args) {
new Entity().entityEvent(new EntityEvent());
}
Throwable :
public class Class1 {
public void logicalThrow() throws ThrowableEvent, HelloEvent, LogicEvent {
if(something)
throw new ThrowableEvent();
else if (sayHello)
throw new HelloEvent();
else
throw new LogicEvent();
}
}
public class Class2 {
private Class1 class1 = new Class1();
public static void main(String... args) {
try {
class1.logicalThrow();
} catch(ThrowableEvent e) {
System.out.println("Event thrown: " + e.getClass().getName());
} catch(HelloEvent e1) {
System.out.println("Hello!");
} catch(LogicEvent e2) {
System.out.println("10 + 11 = 101");
}
// the other catches won't run since they inherit ThrowableEvent,
// but I put in the verbose catch statements for an example
}
}