gpt4 book ai didi

java - 关于不可变模式的一些问题

转载 作者:行者123 更新时间:2023-11-29 04:13:45 25 4
gpt4 key购买 nike

我对不可变模式有一些疑问。首先要解决问题我们需要保证以下几点:

1)访问属性的实例方法不能改变实例变量。

2) 确保不可变类的构造函数是唯一的地方 实例变量的值被设置或修改。我认为通过将 inctance 变量作为最终变量,如果存在更改此变量的方法将失败,即使构造函数也无法更改此变量,那么为什么我们需要考虑这两个语句如果我们可以使用final关键字吗??我知道我错过了一些东西。

最佳答案

制作真正的不可变物有一件重要的事情。也许组件是可变数据结构,例如 java.util.Date。使用这个简单的类进行演示:

final class DateWrapper {
private final Date date;
public DateWrapper(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
}

现在你可以写这段代码了:

DateWrapper dw = new DateWrapper(new Date());
dw.getDate().setYear(2020);

这修改了 DateWrapper 类的对象 dw 的实例变量 date。所以这个类并不是真正不可变的。

要解决这个问题,你必须像这样制作防御副本:

final class DateWrapper {
private final Date date;
public DateWrapper(Date date) {
// It must not be possible to modify the date after construction.
// So use a copy of the original object in class DateWrapper.
this.date = new Date(date.getTime());
}
public Date getDate() {
// It must not be possible to modify the date in DateWarapper
// So return a copy.
return new Date(date.getTime());
}
}

因此没有其他类会获得对 DateWrapper 内部结构的可变引用。

另一条规则是:使您的类成为最终类,否则子类可以表现为不可变类,从而违反不可变性契约。这是一个恶意子类的示例,它仅在 DateWrapper 不是 final 时有效:

class Date2Wrapper extends DateWrapper {
final Date date2;
public Date2Wrapper(Date date) {
super(date);
this.date2 = date;
}
public Date getDate() {
return date2;
}
}

关于java - 关于不可变模式的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53585002/

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