Was ist ein Kopie Ersteller?Kopieren Konstruktoren und defensive Kopie
Kann jemand ein kleines Beispiel teilen, die hilfreich sein können zusammen mit defensive Kopieren Prinzip zu verstehen?
Was ist ein Kopie Ersteller?Kopieren Konstruktoren und defensive Kopie
Kann jemand ein kleines Beispiel teilen, die hilfreich sein können zusammen mit defensive Kopieren Prinzip zu verstehen?
Hier erstellen Sie ein neues Objekt, indem Sie ein altes Objekt übergeben und dessen Werte kopieren.
Color copiedColor = new Color(oldColor);
statt:
Color copiedColor = new Color(oldColor.getRed(),
oldColor.getGreen(), oldColor.getBlue());
Das ist eine ziemlich knappe Antwort. Möchten Sie erklären, warum dies möglich ist? –
Hier ist ein gutes Beispiel:
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);
}
}
Beachten Sie, wie der Konstruktor Point(Point p)
eine Point
nimmt und eine Kopie davon - das ist ein copy constructor
.
Dies ist eine defensive
Kopie, weil das Original Point
vor Änderungen geschützt ist, indem Sie eine Kopie davon nehmen.
So jetzt:
// 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);
Beachten Sie, dass dies nicht unbedingt der richtigen Weg, um Objekte zu schaffen. Es ist jedoch eine gute Art und Weise der Erstellung von Objekten, die sicherstellen, dass Sie nie zwei Referenzen auf das gleiche Objekt durch Zufall haben. Das ist natürlich nur gut, wenn Sie das erreichen wollen.
Kopieren Konstruktoren man sieht oft in C++, wo sie für teilweise versteckte, automatisch aufgerufene Operationen benötigt werden.
java java.awt.Point
und Rectangle
in den Sinn kommen; auch sehr alte, veränderbare Objekte.
Durch die Verwendung unveränderlicher Objekte, wie String
oder BigDecimal
, genügt es, die Objektreferenz zuzuweisen. In der Tat, wegen der frühen Phase von Java nach C++, gibt es noch einen dummen Copykonstruktor in 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);
}
}
Wie erstellt die Objektreferenz für ein unveränderliches Objekt eine Kopie? Würden Sie nicht einfach zwei Referenzen auf dasselbe Objekt erhalten? – darrenmc
@darrenmc hier die Rezepte werden Kopien im folgenden Sinn sein: die Listen der Zutaten sind separate Instanzen. Jeder Bestandteil wird jedoch geteilt. Wenn Inhaltsstoff ein unveränderliches Objekt ist. wie Kohl, dann gut. Wenn der Zutatenbestand rezeptspezifisch ist, sagen wir mit der Menge, dann müsste jeder Inhaltsstoff auch kopiert werden. In meiner Antwort wollte ich auf der obersten Ebene bleiben, dem Feld "Zutaten". –
Vorsicht, 'BigDecimal' ist nicht wirklich unveränderlich. Siehe https://StackOverflow.com/a/12600683/14731 – Gili
Copy-Konstruktor in Java verwendet werden kann, wenn Sie ein Objekt klonen müssen
class Copy {
int a;
int b;
public Copy(Copy c1) {
a=c1.a;
b=c1.b;
}
}
In Java, wenn Sie Kopie geben c2=c1
; Erstellt einfach einen Verweis auf das ursprüngliche Objekt und nicht auf die Kopie, sodass Sie die Objektwerte manuell kopieren müssen.
sehen:
Eine Kopie Konstruktor wird verwendet, um ein neues Objekt mit den Werten eines bestehenden Objekts zu erstellen.
Ein möglicher Anwendungsfall besteht darin, das ursprüngliche Objekt vor einer Änderung zu schützen, während das kopierte Objekt zur Bearbeitung verwendet werden kann.
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;
}
.
.
.
}
Verwandte zu defensiver Kopie here ist ein gut
http://www.javapractices.com/topic/TopicAction.do?Id=12 – PermGenError
[Kopierkonstruktoren in der Tiefe] (http lesen: // bit.ly/YGLDhy). –
Eine ausführliche Erklärung zum defensiven Kopieren finden Sie hier: [Defensives Kopieren] (http://www.javapractices.com/topic/TopicAction.do?Id=15). – longhua