Quando e perché dovresti generalmente sacrificare typesafety per un'interfaccia di programmazione migliore?
Lasciatemi fare un esempio: se avessi la possibilità di scegliere tra due aggregatori di eventi, quale preferiresti e perché?
Versione riflettente:
SomeEvent.subscribe(instance, "nameOfAMethod"); //method called via reflection
SomeEvent.fire(arg1, arg2); //the firing could actually even be statically typed
Versione tipizzata staticamente:
EventSystem.getEvent(SomeEvent.class).subscribe(new EventHandler<Payload>() {
public void eventOccurred(Object sender, Payload payload) {
//event handler code here
}
});
EventSystem.getEvent(SomeEvent.class).fireEvent(payload);
Si noti che in Java, a causa della cancellazione dei tipi, non è possibile implementare un'interfaccia generica con parametri di tipi diversi più di una volta e è necessario ricorrere a classi anonime o esterne per i gestori.
Ora il sistema di eventi riflessivi ha un'interfaccia utente migliore, ma si perde la sicurezza del tipo. Quale preferiresti? Vuoi creare classi di eventi vuote solo per il gusto di avere un simbolo, come Microsoft lo fa con PRISM nel suo aggregatore di eventi?