2013-08-26 22 views
6

Sono molto nuovo in Java e sto cercando di imparare l'argomento, avendo un'esposizione precedente alla programmazione solo in HTML/CSS. Ho iniziato con Herbert Schildt e ho proseguito in alcune pagine.Vantaggi del sovraccarico del costruttore

Non riesco a capire i vantaggi esatti del sovraccarico del costruttore. Non è più semplice sovraccaricare i metodi utilizzando il singolo costruttore per la flessibilità? Inoltre, se sto cercando di usare il sovraccarico del costruttore per usare un oggetto per inizializzarne un altro, ci sono modi più semplici per farlo! Quindi quali sono i vantaggi e in quale situazione dovrei usare Sovraccarico del Costruttore.

+0

molto bella domanda! –

+0

La reputazione di Schildt non va bene quando si parla di Java? Ricordo che era fondamentalmente una risata quando ha provato a scrivere libri su C e C++ ... – cHao

+0

Il libro di Schildt su Java è buono. Non so quali sono quelli di C e C++. Questo libro Java parte dal molto semplice. Quindi per qualcuno, che è nuovo a OOP e Java, è davvero illuminante. –

risposta

5

Costruttore sovraccarico è molto utile per i valori simulare predefiniti, o costruire un oggetto da un'istanza (copia) già esistente
Ecco un esempio:

public class Color { 

    public int R, G, B, A; 

    // base ctr 
    public Color(int R, int G, int B, int A) { 
     this.R = R; 
     this.G = G; 
     this.B = B; 
     this.A = A; 
    } 

    // base, default alpha=255 (opaque) 
    public Color(int R, int G, int B) { 
     this(R, G, B, 255); 
    } 

    // ctr from double values 
    public Color(double R, double G, double B, double A) { 
     this((int) (R * 255), (int) (G * 255), (int) (B * 255), (int) (A * 255)); 
    } 

    // copy ctr 
    public Color(Color c) { 
     this(c.R, c.G, c.B, c.A); 
    } 

} 

Qui, il primo costruttore è molto semplice. Si specifica R, G, B & valore alfa per un colore.

Mentre questo è sufficiente per utilizzare la classe Color, si fornisce un secondo costruttore, liter, che assegna automaticamente 255 a alpha se non specificato dall'utente.

Il terzo ctr mostra che è possibile creare un'istanza dell'oggetto Color con il doppio compreso tra 0 e 1. anziché i numeri interi.

L'ultimo accetta un Colore come argomento univoco, copia l'oggetto specificato.

I vantaggi si trovano anche nel fatto che il primo costruttore viene sempre chiamato, e puoi usarlo per contare manualmente le tue istanze. Diciamo che avete un attributo private static int count=0, è possibile tenere traccia del numero di istanza di colore in questo modo:

// base ctr 
    public Color(int R, int G, int B, int A) { 
     this.R = R; 
     this.G = G; 
     this.B = B; 
     this.A = A; 
     ++count; 
    } 

count viene incrementato da qualsiasi costruttore.

0

Quando si ha a che fare con immutable classes e si desidera fornire più modi per istanziarli, è opportuno sovraccaricare il costruttore.

+1

Si * potrebbe * farlo con più metodi di fabbrica che delegano a un singolo costruttore. Ma probabilmente sarebbe un imbroglio ;-) –

1

Dipende completamente da come si sta costruendo il proprio oggetto.

Uno degli esempi classici di overloading del costruttore è ArrayList in Java. ArrayList ha tre costruttori uno è vuoto, altro prende un oggetto di raccolta e uno prende la Capacità iniziale. questo costruttore sovraccarico consente flessibilità durante la creazione dell'oggetto arraylist. Potrebbe essere possibile che non si conoscano le dimensioni dell'arrayylist durante la creazione di quanto si possa semplicemente utilizzare il costruttore di default senza argomenti, ma se si conoscono le dimensioni allora è meglio usare il Costruttore sovraccarico che prende la capacità. Poiché ArrayList può anche essere creato da un'altra Collezione, potrebbe provenire da un'altra Lista piuttosto che avere un altro costruttore sovraccarico che abbia senso. Usando il costruttore sovraccarico puoi convertire la tua ArrayList in Set o in qualsiasi altra raccolta.

More info con esempi generali.

1

Il modo in cui è definito il costruttore assicurerà che i parametri del costruttore verranno passati all'oggetto dopo l'istanziazione.

Il sovraccarico di un metodo non "forza" nessuno a chiamarlo diversamente dai parametri nel costruttore, in cui non è possibile instanciare un oggetto senza passare quei parametri.

Avere un modo multiplo per costruire un oggetto può essere utile, come con la classe Color, nella risposta di ndj, può essere creato in quattro modi diversi. Ogni modo si assicura che Color come le informazioni minime siano utili, o "funzionano".

Quelle informazioni potrebbero mancare se Color avuto solo un contructor senza parametri e, per la classe di "lavorare", sarebbe quello di chiamare setR e gli altri metodi ... che non esistono nella classe Color.

0

È possibile avere più variabili in una classe ... Ma si desidera inizializzare solo poche (una o due) variabili al momento della creazione dell'oggetto. Quindi in questo caso è sempre meglio avere costruttori sovraccaricati in modo da poter chiamare il rispettivo costruttore in base alle proprie esigenze. Una cosa che dovresti sempre ricordare, mentre i costruttori di overload forniscono sempre un costruttore predefinito (costruttore di argomenti Zero). Anche con implementazione vuota.

+1

Non è necessario ** sempre ** fornire un costruttore predefinito. – proskor

+0

Potrebbe anche non essere ** voluto ** fornire un costruttore predefinito. –

+0

Se non esiste un costruttore predefinito .. e la classe è stata estesa da un'altra classe .. ad esempio, la classe ur è A che non ha un costruttore predefinito..Class B estende A ... Durante la creazione dell'oggetto della classe B .. Se dici B b = new B(); allora cosa succederà? – user2714918

2

Considerando l'esempio più semplice di costruttore di sovraccarico:

Class A 
{ 
int a; 

A() 
{ 
this.a = 0; 
} 

A(int a) 
{ 
this.a = a; 
} 

} // end class 

Vantaggio: Ora mi potrebbe semplicemente bisogno di utilizzare il costruttore di default new A() per assegnare i valori predefiniti o per un caso più dinamico specificare quale valore che deve essere new A(10) che è un costruttore parametrizzato. do read this question

Non è più facile a metodi di sovraccarico utilizzando unico costruttore di flessibilità?

Il lavoro del costruttore è creare un'istanza dell'oggetto e il lavoro del metodo è elaborare i valori dell'oggetto. Limitando così i metodi per l'elaborazione (eccezione alla setter methods) e di costruzione per la creazione di oggetti vi aiuterà in un lungo periodo e anche rendere la vostra classe più usabile per i tuoi compagni di squadra

Inoltre se sto cercando di usare costruttore di sovraccarico per usa un oggetto per inizializzare un altro, ci sono modi più semplici per farlo!

alternativa è initializer, also read

Problemi correlati