2010-04-26 11 views
6

Questa è una domanda di codifica stile e pratiche raccomandate:Metti una chiamata a super() all'inizio dei tuoi costruttori?

Come spiegato nelle risposte alla domanda unnecessary to put super() in constructor?, se si scrive un costruttore per una classe che si suppone di utilizzare l'impostazione predefinita (no-arg) costruttore dal superclasse, si può chiamare super() all'inizio del costruttore:

public MyClass(int parm){ 
    super(); // leaving this out makes no difference 
    // do stuff... 
} 

ma si può anche omettere la chiamata; il compilatore agirà in entrambi i casi come se la chiamata super() fosse presente.

Quindi, metti la chiamata nei tuoi costruttori o no?

Da un lato, si potrebbe obiettare che includere lo super() rende le cose più esplicite. OTOH, non mi piace scrivere codice ridondante, quindi personalmente tendo a lasciarlo fuori; Lo vedo comunque regolarmente in codice dagli altri.

Quali sono le tue esperienze? Hai avuto problemi con l'uno o l'altro approccio? Avete linee guida per la codifica che prescrivono un approccio?

BTW: Una questione collegata (solo per riferimento):

Is there a reason to explicitly code a default constructor when there are no other constructors?

+0

Non ce l'ho, ma probabilmente perché quasi tutto il codice che ho letto (e imparato da!) No. Potrei semplicemente perpetuare lo stile cattivo che ho imparato. –

risposta

20

non scrivo la chiamata super() per lo stesso motivo non scrivo calchi inutili:

aggiunge rumore al codice senza fornire alcuna informazione aggiuntiva (né al compilatore né allo allo sviluppatore che legge il mio codice).

+3

+1 per "evitare il rumore". Il codice è già abbastanza difficile da leggere ... – sleske

4

Le impostazioni di default di alcune versioni di alcuni IDE generare automaticamente, in modo che è uno dei motivi che si potrebbe vedere esso.

Se scriverlo o meno dipende da chi lo leggerà. Preferisco non aggiungerlo, ma se non si è certi che i membri del team capiscano cosa fa il compilatore e come procede la costruzione dell'oggetto, è possibile aggiungerlo "nel caso".

+7

Se non sei certo che i membri del team capiscano cosa fa il compilatore, allora hai problemi più seri ... – sleske

+1

true :) (15chrs) – Bozho

4

Non lo so, ma l'argomento che mi è stato dato per averlo fatto mentre ero all'università era che rende le cose più esplicite, quindi non "dimentichi" che viene chiamato un costruttore di superclasse.

Solo che non ne vedo il bisogno.

2

Quali sono le tue esperienze? Hai problemi con l'uno o l'altro approccio ?

ho mai chiamato il costruttore di default (esplicito) e mai affrontato problemi

+0

-1 Probabilmente hai fatto ... implicitamente – Tomas

+0

@Tomas - sì, certo, risolto è felice adesso? – stacker

1

Non l'ho mai aggiunto e sono rimasto profondamente scioccato quando un collega non ha capito che c'era una chiamata implicita alla super classe, quindi forse dovrei iniziare a farlo.

+8

O forse dovresti iniziare a educare il tuo collega, invece ;-) –

0

Effettivamente inserisco la chiamata super() perché ritengo che sia un utile aiuto alla memoria. Quando ho scritto un pezzo di codice alcuni mesi fa e ci ritorno, lo super() mi ricorda quando guardo al costruttore che la classe che ho scritto eredita da qualcosa.

+4

Non è il fatto che dice "estende" all'inizio della classe abbastanza ;-)? – sleske

+0

Sarebbe se il costruttore e la definizione della classe fossero visualizzabili contemporaneamente, il che non è sempre il caso. Generalmente metto tutti i miei attributi prima dei miei metodi. –

1

Uso lo super() solo quando il costruttore super() ha bisogno di parametri.

+3

Ovviamente, ma questa è una situazione completamente diversa: se devi passare dei parametri, devi * chiamare esplicitamente super (parms), quindi non è più una questione di stile di codifica ... – sleske

1

Vantaggio: Chiunque legga il proprio codice sa che si desidera veramente chiamare il costruttore predefinito, non si è uscito dalla chiamata per errore.

Svantaggio: Si ingombra il codice con informazioni non importanti.

In genere, se un linguaggio consente di omettere alcune istruzioni, non lo fa male. Penso che sia una questione di valutare i pro ei contro. Ad esempio, scrivere esplicitamente super() quando il costruttore ha parametri e la classe base ha anche costruttori parametrici disponibili può essere una buona idea.

0

Cerco di evitare di scrivere codice in cui è necessario chiamare super(), perché preferisco la composizione sull'ereditarietà.

Se devo derivare da un'altra classe, provo a mettere entrambi dietro una propria interfaccia e passare uno di loro all'altro come dipendenza.

Se ho una classe di lib, tuttavia, che non posso dare una dipendenza extra, la prima cosa che cerco è di usare un decoratore.

Se questo non funziona, e devo derivare da un'implementazione, penso che non importa se scrivere super() o no, dal momento che accade così raramente;)

Quindi, tutto sommato , Penso che questa domanda sia inutile.

Problemi correlati