英文:
Will this be considered a deep copy return?
问题
我创建了一个名为"User"的实体类,其中包括生成的值"Id"。
以下是代码片段:
@Transient
private User u;
public User() {
super();
}
public User(String name, Integer age, Occupation oc, Integer salary) {
this.name = name;
.
.
.
}
// Getters
public Integer getUniqueID() {
u = new User(this.name, this.age, this.oc, this.salary);
return u.uniqueID;
}
public String getName() {
u = new User(this.name, this.age, this.oc, this salary);
return u.name;
}
.
.
.
这是否被认为是深拷贝返回?是否存在封装违规?
英文:
I created a Entity class - "User" with Generated Value - "Id".
Below is the snippet of the code:
@Transient
private User u;
public User(){
super();
}
public User(String name, Integer age, Occupation oc, Integer salary){
this.name = name;
.
.
.
}
//Getters
public Integer getUniqueID() {
u = new User(this.name, this.age, this.oc, this.salary);
return u.uniqueID;
}
public String getName() {
u = new User(this.name, this.age, this.oc, this.salary);
return u.name;
}
.
.
.
Will this be considered a deep copy return? Any encapsulation breach?
答案1
得分: 0
为了制作User
的深度复制,您需要复制Occupation
,其他字段不相关。在您的类中包括一个复制构造函数通常是一个好主意:
public User(User other){
this(other.name, other.age, other.oc, other.salary);
}
您可以这样制作一个“深度”复制构造函数:
public User(User other){
this(other.name,
other.age,
other.oc == null ? null : new Occupation(other.oc),
other.salary);
}
或者,您可以在另一个构造函数中创建Occupation
的副本:
public User(String name, Integer age, Occupation oc, Integer salary){
this.name = name;
this.age = age;
this.oc = oc == null ? null : new Occupation(oc);
this.salary = other.salary;
}
您还可以添加一个用于复制用户的方法:
public User copy() {
return new User(name, age, oc, salary);
}
并且添加一个用于深度复制的方法:
public User deepCopy() {
return new User(name, age, oc == null ? null : oc.deepCopy(), salary);
}
假设您在Occupation
类中有一个类似的deepCopy
方法。
有时在getter和setter中复制对象是一个好主意:
public Occupation getOccupation() {
return oc == null ? null : new Occupation(oc);
}
public void setOccupation(Occupation oc) {
this.oc = oc == null ? null : new Occupation(oc);
}
当然,复制对象会带来一些开销,有时实际上您不想复制对象,而是希望从两个或更多对象中引用相同的对象。您需要决定哪些字段需要复制,以及深度如何复制。
请注意,不可变对象永远不需要复制,应尽可能多地使用它们。
英文:
To make a deep copy of a User
you would need to copy the Occupation
as well; the other fields are irrelevant. It is often a good idea to include a copy constructor in your class:
public User(User other){
this(other.name, other.age, other.oc, other.salary);
}
You can make it a "deep" copy constructor like this:
public User(User other){
this(other.name,
other.age,
other.oc == null ? null : new Occupation(other.oc),
other.salary);
}
Alternatively, you could create the copy of the Occupation
in the other constructor:
public User(String name, Integer age, Occupation oc, Integer salary){
this.name = name;
this.age = age;
this.oc = oc == null ? null : new Occupation(oc),
this.salary = other.salary;
}
You can also add method to make a copy of a user:
public User copy() {
return new User(name, age, oc, salary);
}
And and another one to make a deep copy:
public User deepCopy() {
return new User(name, age, oc == null ? null : oc.deepCopy(), salary);
}
assuming you have a similar deepCopy
method in class Occupation
.
It's sometimes a good idea to copy objects in getters and setters:
public Occupation getOccupation() {
return oc == null ? null : new Occupation(oc);
}
public void setOccupation(Occupation oc) {
this.oc = oc == null ? null : new Occupation(oc);
}
Of course, making a copy of an object has a cost, and sometimes you actually don't want to copy objects, but rather reference the same object from two or more objects. You have to decide which fields have to be copied, and how deep.
Note that immutable objects don't ever need to be copied, and should be used as much as possible.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论