È meglio avere costruttori con o senza parametri?

4

È meglio avere costruttori con o senza parametri e perché?

public NewClass( String a,  String b, int c) throws IOException
{
    //something
}

o

public NewClass() 
{
    //something
}
    
posta Yvette Colomb 04.11.2013 - 07:42
fonte

3 risposte

21

Un costruttore dovrebbe stabilire l'invariante iniziale del tuo oggetto, cioè metterlo in uno stato valido e utilizzabile.

Se il tuo oggetto non è realmente utilizzabile come un'istanza del tipo che è dopo la costruzione, è un segno che hai un po 'di macchia tra l'inizializzazione dell'oggetto e l'uso dell'oggetto.

Se è impossibile fornire tutte le informazioni necessarie in anticipo per costruire correttamente il tuo oggetto, potresti prendere in considerazione una sorta di builder per raccogliere lo stato in modo incrementale prima di creare un'istanza dell'oggetto.

In generale, gli oggetti di tipo zombi che hanno l'inizializzazione dopo la costruzione e l'invalidazione prima dello smaltimento tendono ad essere soggetti a errori, in particolare se non esiste un supporto linguistico per questo, lasciandovi applicare i concetti nella documentazione e nelle asserzioni.

    
risposta data 04.11.2013 - 08:17
fonte
1

Dovresti favorire i costruttori senza parametri.

Ci sono due ragioni principali per questo, il primo è che i costruttori non hanno un buon modo di riportare errori. Certo, puoi lanciare eccezioni, ma questa è una risposta ad impatto piuttosto elevato a semplici dati non validi: costringe gli utenti del tuo oggetto a trattarlo con cura ingiustificata, dal momento che qualsiasi creazione può lanciare.

Il secondo è che a volte (in alcune lingue in particolare) può causare disconnessioni (o codice duplicato) tra la validazione per l'impostazione del costruttore e l'impostazione delle proprietà per far rispettare l'invarianza. Poiché gli invarianti di classe sono uguali, la convalida dovrebbe essere la stessa. Consentendo due modi efficaci per impostare valori, complica la convalida della classe.

Per essere chiari, non sto dicendo di non avere mai costruttori parametrizzati. E sicuramente non sto dicendo di avere qualche metodo di inizializzazione. Quello che sto dicendo è che gli oggetti dovrebbero avere uno stato iniziale chiaro e ben definito con impostazioni predefinite sane.

A volte gli oggetti non possono avere valori predefiniti sani e invece hanno bisogno del loro stato iniziale passato a loro. Succede. Ma in generale, dovresti cercare di evitarlo.

    
risposta data 04.11.2013 - 15:34
fonte
1

Preferisco i costruttori con parametri e ci sono due ragioni principali:

  • Il passaggio di valori in un costruttore indica che i campi possono essere final e quindi convalidati e impostati una sola volta. Nota che i campi finali rendono la codifica multi-thread molto più semplice (vedi link ).
  • Rende molto più semplice il test se i valori (in particolare gli oggetti) trasmessi tramite un costruttore possono essere derisi per comportarsi in modo desiderato. Aiuta a testare separatamente.

Non penso che ci sia qualcosa di sbagliato nei setter getter, ma di solito li uso solo in una classe 'builder' o 'bean'.

    
risposta data 04.11.2013 - 20:18
fonte

Leggi altre domande sui tag