gpt4 book ai didi

java - 为什么我们必须对不可变类进行防御性复制

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:32 26 4
gpt4 key购买 nike

为什么我们必须进行防御性复制才能实现不可变类?看这段代码:

public final class EmailMessage   {
private final String from;
private final String to;
private final String message;
private final Date date;

public EmailMessage( String from, String to, String msg, Date date )
{
this.to = to;
this.from = from;
this.message = msg;
this.date = new Date(date.getTime());// instead of date;
}

public String getFrom()
{
return( from );
}

public Date getDate() {
return( new Date( date.getTime() ); // instead of Date
}
}

如果我们不进行防御性复制,为什么它不会是不可变的?

最佳答案

为了实现不变性,您必须复制所有传递给构造函数的可变对象,并返回存储在您的类中的所有可变对象的副本,如果有的话。

  • 如果您不复制传递给您的日期,调用者可以在您的对象构建后更改日期,从而有效地改变它。
  • 如果您不从可变对象的 getter 返回副本,则调用者可以改变他们从您那里获得的对象,从而有效地改变您的对象。

在您的具体示例中,Date 类是可变的。如果你跳过构造函数中的复制,恶意代码可以这样做:

Date d = new ...
EmailMessage msg = new EmailMessage("lazy dog", "quick brown fox", "Jump!", d);
d.setTime(d.getTime()+12345); // Changes the date inside msg

如果跳过第二个副本,调用者可以这样做:

EmailMessage msg = ...
Date d = msg.getDate();
d.setTime(d.getTime()+12345); // Changes the date inside msg

关于java - 为什么我们必须对不可变类进行防御性复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29386299/

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