Java redeclare le interfacce ereditate?

7

Mentre lavoravo su una piccola classe chiamata FractionNumber , ho scoperto di chiedermi se dovrei implementare un'interfaccia che sto già implementando. Sembra stupido, lo so, ma sopporta me.

La mia classe FractionNumber estende Number ; Number implementa Serializable . E non sono sicuro che FractionNumber debba implementare esplicitamente anche Serializable .

Ovviamente non ha molta importanza perché Serializable definisce solo i metodi finali e FractionNumber eredita Serializable 'implementazione' di Number . Ma mi piace rendere il mio FractionNumber esplicitamente Serializable .

Ora alla mia domanda: è semplicemente inutile o la verbosità aiuta in qualche modo? Ha senso, in senso filosofico, dichiarare che FractionNumber è qualcosa che già è?

    
posta kalsowerus 28.07.2016 - 09:08
fonte

2 risposte

3

Da un punto di vista del codice

I contratti impostati dal tipo genitore dovrebbero essere impliciti per il sottotipo.

Se senti la necessità di esprimere le capacità di serializzazione in ogni tipo che può essere serializzato (forse hai bisogno di ricordare esplicitamente a te stesso / co-sviluppatori che qualcosa può essere serializzato) dovresti rifattorizzare il tuo codice per rafforzare l'implicazione.

Da un punto di vista JavaDoc

Tutte le interfacce implementate dal tipo comprese le interfacce ereditate sono visualizzate nell'intestazione sotto " Tutte le interfacce implementate ". L'unica differenza è la dichiarazione effettiva visualizzata in JavaDoc:

Se si interfaccia direttamente l'implementazione :

public class Sub extends Super implements Serialization

Se ereditato :

public class Sub extends Super

Per me, questo è ingombro (duplicazione), e consiglio contro di esso.

    
risposta data 01.11.2016 - 06:07
fonte
1

In generale, probabilmente non dovresti ridichiarare di implementare le interfacce in questo modo, ma Serializable non è una normale interfaccia. Dici che " Serializable definisce solo i metodi finali", ma non è questo il caso ( Ho ricontrollato ). Serializable non dichiara affatto metodi. È una interfaccia marker che è ampiamente considerata come un anti-modello e sono pienamente d'accordo con tale valutazione.

Il fatto che la tua classe debba essere serializzabile perché una super-classe (o interfaccia) implementa Serializable è un artefatto uno dei più importanti difetti di progettazione in Java. Serializable è specificato utilizzando un'interfaccia ma transient è una parola chiave. Perché serializable non è una parola chiave è anche un po 'un graffio di testa. Se la serializzazione java è stata progettata ora, probabilmente verrebbe eseguita con le annotazioni.

A causa di tutta questa pazzesca, se si intende implementare Serializable , andrei avanti e ridichiarò per mostrare che si intende effettivamente che funzioni con la serializzazione java e che non sia Serializable perché semplicemente una base la classe è stata dichiarata in quel modo. Personalmente, non userei la serializzazione java, comunque. Ci sono molti modi migliori per creare wireformat e penso che l'idea della "trasmissione dell'oggetto" sia intrinsecamente imperfetta.

    
risposta data 01.11.2016 - 20:20
fonte

Leggi altre domande sui tag