Domanda

Mi è stato chiesto questa domanda e sono francamente scatenato:

Invece di scrivere metodi astratti, potremmo provare a farli scombrezzare con eccezioni, come questa:

public int someMethod(int someparameter) {
    throws new RuntimeException("unimplemented");
}
.

Quale sarebbe lo scopo di farlo e qualcuno può fornire un esempio di codice per un metodo astratto che quanto sopra stia cercando di falsificare?Qualsiasi aiuto è molto apprezzato.Grazie.

È stato utile?

Soluzione

Posso pensare a un caso di utilizzo valido (possibilmente): hai una classe astratta e una serie di altre classi durante il tuo progetto che lo ha esteso. (O la classe astratta è in una libreria open source, quindi non hai idea di quali altre classi in tutto l'universo potrebbero essere estese da esso.) Ora, scopri che è utile aggiungere nuovi metodi astratti a questa classe. Ma se si aggiungono metodi abstract alla classe, questa interrutta ogni altra classe che l'ha già estesa, poiché quelle classi devono essere modificate per contenere override per i nuovi metodi. Quindi posso vedere come, in alcuni casi, potrebbe essere considerato più fattibile aggiungerli come metodi non astratti e farli lanciare eccezioni solo nel caso in cui una classe nuova che si estende utilizza i nuovi metodi ma Denta di scrivere un metodo prevalente. Non sarà catturato in compilazione, ma almeno potrebbe essere catturato durante il test.

Non sono sicuro di quanto sia legittimo questo motivo, poiché è anche possibile definire un nuovo generacolo di classe astratto che estende il vecchio, per contenere i nuovi metodi. Ciò può rappresentare le proprie sfide di manutenzione, però. Non sono sicuro.

Ho notato che Java definisce un NewImprovedWhatever di classe astratto, che contiene due metodi non astratti, java.net.SocketImpl e shutdownInput() e shutdownOutput(), la cui implementazione predefinita è di dare un'eccezione:

protected void shutdownInput() throws IOException {
  throw new IOException("Method not implemented!");
}
.

I commenti indicano che sono stati aggiunti in 1.3, quindi forse è l'esatto motivo per cui è stato fatto in questo modo, cioè non richiedere la modifica di altre classi che già estese SocketImpl. Ma non lo so per certo.

In ogni caso, un design come questo sarebbe sicuramente un codice molto cattivo, se la classe è stata progettata in quel modo da zero. Ma i bei concetti O-O che apprendiamo in classe non sono sempre così belli in pratica quando il codice esistente deve essere modificato.

Altri suggerimenti

Ho a volte lanciato UnsupportedOperationException daUn metodo la cui funzionalità non è stata ancora implementata.(C'è anche un NotimplementededException in Apache Commons che è una sottoclasse di unsupportedOperationException.) Questo è stato sempre significato come segnaposto e un messaggio agli altri utilizzando la relativa classe o servizio che il metodo non è ancora completo.Tale codice non è mai arrivato alla produzione, tuttavia.

Lo scopo di farlo sarebbe quello di scrivere volutamente Bad Code .
Se uno vuole confondere i suoi lettori e volerli sentire l'agonia di attraversare il loro codice, allora si scrive tale codice.
Mostra anche la mancanza di progettazione di abilità nel codice.
Una API scarsamente scritta avrà tale codice.
Non farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top