condizioni
Esistono molti sottotipi di Exception
che non hanno nessuno stato o comportamento aggiunto. Ad esempio, ClosedByInterruptException
codice .
Domanda
Perché la sottotipizzazione non aggiunge stato o comportamento "accettabile" nel caso di Exception
? Da quello che so, un interface
dovrebbe essere usato quando si definisce un nuovo comportamento, e un class
dovrebbe essere usato quando si implementa un comportamento o quando si aggiunge uno stato (che può causare un override del comportamento). A parte i tipi Exception
, l'applicazione sarebbe accettabile?
Ti preghiamo di non utilizzare marcatori come esempio.
Elaborazione
Di seguito è riportato un disegno corroso:
class Dog extends Animal {
public Dog(String name) {
super(name);
}
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
}
abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
//...assume methods that use String name are not overridable
}
Per coloro che non capiscono perché questo è disapprovato, vedi in fondo al post.
Per coloro che capiscono, questo rientrerebbe nella stessa categoria di ClosedByInterruptException
: i sottotipi non definiscono nuovo stato o comportamento. Quindi perché esistono eccezioni come questa se il design è disapprovato?
Sebbene l'eccezione sia più descrittiva, è possibile includere una descrizione estesa tramite un messaggio String
. Vedendo come viene generata una SocketException
nel caso in cui un socket venga chiuso in anticipo, anziché in SocketClosedException
o SocketNotConnectedException
, perché una nuova API utilizza il progetto in questione?
Per coloro che si chiedono perché il design non è di buon occhio
Esaminando l'esempio Cat
e Dog
, entrambi eseguono esattamente lo stesso modo, poiché non sono stati aggiunti nuovi comportamenti, né i comportamenti sono stati sovrascritti. L'unica differenza verrebbe dal controllo del tipo tramite instanceof
. Se utilizzi instanceof
, stai tentando di eseguire un tipo di comportamento in base al tipo, ad esempio:
Animal animal = ...;
if(animal instanceof Dog) {
//perform some behavior
} else if(animal instanceof Cat) {
//perform some behavior
}
In un caso come questo, il comportamento dovrebbe essere contenuto nel tipo sostituendo un metodo e il comportamento dovrebbe essere attivato tramite il polimorfismo.