gpt4 book ai didi

java - 我应该为从 getters 返回的每个对象编写复制构造函数吗?

转载 作者:行者123 更新时间:2023-11-30 06:26:10 25 4
gpt4 key购买 nike

好吧,标题说明了一切。

比如我有一个Employee类

class Employee
{
private Date joinDate;

public Date getJoinDate()
{
return joinDate;
}
}

此处 getJoinDate 返回对内部 joinDate 对象的引用。当我在 FindBug 中分析我的代码时,它给了我一个“恶意代码漏洞”警告,因为“...可能通过返回 ClassXYZ.pqrDate 来暴露内部表示”

因此,访问此 getter 的任何代码都可能修改存储在实异常(exception)部的类实例中的日期。那么我应该使用复制构造函数

Q1。我是否应该编写复制构造函数(或遵循任何其他方法):

class Employee
{
private Date joinDate;

Employee(Employee e) //copy constructor
{
joinDate = e.joinDate;
}

public Date getJoinDate()
{
return joinDate;
}
}

Q2 如何为框架对象编写复制构造函数? 我可以为业务对象定义复制构造函数,但不能为框架对象定义复制构造函数。 我是否应该有一个通用的 util 类,所有方法都返回接受该实例的框架类的新实例

class CopyConstructorUtil
{
public Date copyDate(Date date)
{
return new Date(date.getTime());
}
//....
}

此外,Java Object 类确实提供了 clone() 方法,所有类都继承了该方法。但它返回对象。那么我应该简单地在 getter 中进行转换吗? :

class Employee
{
private Date joinDate;

public Date getJoinDate()
{
return (Date)joinDate.clone();
}
}

Q3。哪种方法更可取?还是我应该使用任何其他方法?

最佳答案

问题是 Java 数据类型的可变性。因此,即使使用复制构造函数,在没有实例化新 Date 的情况下,仍然会泄漏您的对象状态。

你应该这样做(你需要同时修改 getter 和 setter),否则你会泄露你的对象状态:

public Date getJoinDate() {
return new Date(joinDate.getTime());
}

public void setDate(Date joinDate) {
this.joinDate = new Date(joinDate.getTime());
}

调用 clone() 不是很好,因为正如 Effective Java,第 2 版 中提到的,它可能是一个安全问题:

class MyDate extends Date {
public Object clone() {
return this;
}
}

现在您可以将此对象作为日期传递,并且因为调用者可以持有对该对象的引用,所以它可以操纵对象的状态,即使在克隆之后也是如此。

关于java - 我应该为从 getters 返回的每个对象编写复制构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14723423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com