2013-02-22 11 views
7

Che cos'è un copy constructor?Copia di costruttori e copia difensiva

Qualcuno può condividere un piccolo esempio che può essere utile per capire insieme a principio copia difensiva?

+0

http://www.javapractices.com/topic/TopicAction.do?Id=12 – PermGenError

+1

[costruttori di copia di profondità] (http: // bit.ly/YGLDhy). –

+0

Qui è possibile trovare una spiegazione dettagliata per la copia difensiva: [Copia difensiva] (http://www.javapractices.com/topic/TopicAction.do?Id=15). – longhua

risposta

0

Qui è dove si crea un nuovo oggetto, passando un vecchio oggetto, copiandone i valori.

Color copiedColor = new Color(oldColor); 

invece di:

Color copiedColor = new Color(oldColor.getRed(), 
           oldColor.getGreen(), oldColor.getBlue()); 
+0

Questa è una risposta piuttosto concisa. Ti va di spiegare perché questo potrebbe essere fatto? –

9

Ecco un buon esempio:

class Point { 
    final int x; 
    final int y; 

    Point(int x, int y) { 
    this.x = x; 
    this.y = y; 
    } 

    Point(Point p) { 
    this(p.x, p.y); 
    } 

} 

Si noti come il costruttore Point(Point p) prende un Point e fa una copia di esso - che è un copy constructor.

Questa è una copia defensive perché l'originale Point è protetto da modifiche prendendo una copia di esso.

Così ora:

// A simple point. 
Point p1 = new Point(3,42); 
// A new point at the same place as p1 but a completely different object. 
Point p2 = new Point(p1); 

Nota che questo non è necessariamente il modo corretto di creazione di oggetti. È, tuttavia, un modo valido per creare oggetti che assicurano che non si abbiano mai due riferimenti allo stesso oggetto per errore. Chiaramente questa è solo una buona cosa se è quello che vuoi ottenere.

6

Copia i costruttori che si vedono spesso in C++ dove sono necessari per operazioni parzialmente nascoste e richiamate automaticamente.

java java.awt.Point e Rectangle venire in mente; anche oggetti molto vecchi e mutevoli.

Utilizzando oggetti immutabili, come String o BigDecimal, l'assegnazione del riferimento all'oggetto è sufficiente. In realtà, a causa della fase iniziale di Java dopo C++, v'è ancora un costruttore stupido copia nella String:

public class Recipe { 
    List<Ingredient> ingredients; 

    public Recipe() { 
     ingredients = new ArrayList<Ingredient>(); 
    } 

    /** Copy constructor */ 
    public Recipe(Recipe other) { 
     // Not sharing: ingredients = other.ingredients; 
     ingredients = new ArrayList<Ingredient>(); 
     ingredients.addAll(other.ingredients); 
    } 

    public List<Ingredient> getIngredients() { 
     // Defensive copy, so others cannot change this instance. 
     return new ArrayList<Ingredient>(ingredients); 
     // Often could do: 
     // return Collections.immutableList(ingredients); 
    } 
} 
+0

In che modo l'assegnazione del riferimento all'oggetto per un oggetto immutabile produce una copia? Non finirai con due riferimenti allo stesso oggetto? – darrenmc

+0

@darrenmc qui le ricette saranno copie nel seguente senso: gli elenchi di ingredienti sono istanze separate. Tuttavia, ogni ingrediente è condiviso. Se ingrediente è un oggetto immutabile. come cavolo, quindi bene. Se l'ingrediente è specifico della ricetta, diciamo con la quantità, allora si dovrebbe copiare anche ogni ingrediente. Nella mia risposta volevo rimanere al livello più alto, il campo "ingredienti". –

+1

Attenzione, 'BigDecimal' non è in realtà immutabile. Vedere https://stackoverflow.com/a/12600683/14731 – Gili

1

Copy costruttore in Java può essere utilizzato quando è necessario clonare un oggetto

class Copy { 
    int a; 
    int b; 
    public Copy(Copy c1) { 
    a=c1.a; 
    b=c1.b; 
    } 
} 

In java quando si copia c2=c1; crea semplicemente un riferimento all'oggetto originale e non alla copia, quindi è necessario copiare manualmente i valori dell'oggetto.

vedere questo:

1

un costruttore di copia viene utilizzato per creare un nuovo oggetto utilizzando i valori di un oggetto esistente.
Un possibile caso d'uso è proteggere l'oggetto originale da essere modificato mentre l'oggetto copiato può essere utilizzato su cui lavorare.

public class Person 
{ 
    private String name; 
    private int age; 
    private int height; 


/** 
* Copy constructor which creates a Person object identical to p. 
*/ 
    public person(Person p) 
    { 
     person = p.person; 
     age = p.age; 
     height = p.height; 
    } 
. 
. 
. 
} 

correlati a copia difensiva here è una buona lettura