|
1
4
这会让你走得很远,但不会一直走下去。这些变量的类型也需要是不可变的。例如,考虑
这允许某人
并有效地变异不可变类的对象。 此外,建议禁止扩展类(因为没有办法强制子类是不可变的)。请参阅下面第三个问题的答案。
这是正确的。如果所有变量都是final,那么标准setter方法就不可能存在。
子类不能更改超级类的final字段的状态。但继承还有另一个问题。
如果你有一个不可变的
换言之,如果一个不可变类是开放扩展的,那么不变性的大部分(全部)好处都会失去:如果您收到
基本上,原始语句有点多余,这就是为什么我认为它们有点混乱的原因:
此外,这些是 足够的 约束,但不是 必需的 例如,您可以拥有不可变的类,而不需要最终变量/最终字段类型,只要它们是私有的,从不在内部更改,也从不泄露给外部。 |
|
2
2
在上面的代码中。如果列表引用转义,则任何人都可以执行以下操作:
但他们无法做到:
这就是区别。
子类可以访问父类的某些字段,然后对其进行更改。您可以使父类引用指向子类对象并修改其字段。因此,为了确保不变性,必须确保子类不会改变父类中的任何内容。所以就这样吧
|
|
|
3
2
不可变类是您无法更改的类。实现不变性是消除改变对象状态的可能方法的问题。这可以通过结构和行为手段的结合来实现。 但首先,让我们看看“应该拥有”列表:
您的问题:
这不足以保证不变性。例如,如果最终变量之一是数组,则可以更改该数组的状态,从而更改整个对象的状态。这可以通过setter(或类的任何其他方法)完成,或者如果类是“泄漏抽象”,则可以通过外部代码完成。
见上文。将所有字段声明为
它不能 1. 。但这不是重点。
创建不可变类的原因
这有什么关系?
好吧,假设一个方法
要求
参数是不可变的(例如为了安全)。如果您使用不可变类声明它
这是(例如)
1-我需要证明这一点。这取决于我们是否在讨论类为
|
|
|
Emanuel Pinho · 无不变目标push的角度变化检测策略 8 年前 |
|
|
MingtyeP · 如何使用不可变js取消移动列表中的每个元素? 8 年前 |
|
|
Brannon · 让赋值运算符在申报时工作 8 年前 |
|
|
Javallion · JAVA中的不可变对象初始化 8 年前 |
|
|
Ankush Pandit · 字符串与字符串数组元素之间的比较 8 年前 |
|
|
plamkata__ · Swift到Kotlin,管理不可变列表 8 年前 |