![]() |
1
6
是的,你确实从
标记字段
|
![]() |
2
2
对象当然可以有可变的私有字段,并且仍然作为不变的对象工作。要满足不变契约,最重要的是对象从外部看来是不变的。例如,具有非最终私有字段但没有setter的对象将满足此要求。 事实上,如果您的封装是正确的,那么您实际上可以改变内部状态,并且仍然作为“不变”对象成功地操作。一个例子可能是某种延迟的数据结构评估或缓存。 例如,Clojure在其惰性序列的内部实现中就是这样做的,这些对象的行为就好像它们是不可变的,但实际上只有在直接请求它们时才计算和存储未来的值。任何后续请求都会检索存储值。 不过,我要补充一点,那就是实际上想要改变不变对象内部结构的地方的数量可能非常少。如果有疑问,请将其定为最终结果。 |
![]() |
3
0
我认为您只需要考虑它运行的环境,并决定使用反射来操作对象的框架是否是一种危险。 我们可以很容易地编造一个奇怪的场景,在这个场景中,由于配置为使用反射而不是bean setter的Web绑定框架,假定不变的对象通过注入后攻击而被击倒。 |
![]() |
4
0
您肯定可以有一个具有非最终字段的不可变对象。 例如,参见JavaLang.Stand的Java 1.6实现。 |
![]() |
5
0
评论: @埃里克森 像这样: class X { volatile int i, j; } X y; // thread A: X x = new X; x.i = 1; x.j = 2; y = x; // thread B: if (y != null) { a = y.i; b = y.j; } ? |
![]() |
Emanuel Pinho · 无不变目标push的角度变化检测策略 7 年前 |
![]() |
MingtyeP · 如何使用不可变js取消移动列表中的每个元素? 7 年前 |
![]() |
Brannon · 让赋值运算符在申报时工作 7 年前 |
![]() |
Javallion · JAVA中的不可变对象初始化 7 年前 |
![]() |
Ankush Pandit · 字符串与字符串数组元素之间的比较 7 年前 |
![]() |
plamkata__ · Swift到Kotlin,管理不可变列表 7 年前 |