当前位置: 首页 > 面试题库 >

不可变对象和有效不可变对象之间的区别?

龙兴学
2023-03-14
问题内容

这是Java Concurrency in Practice中的一句话

共享的只读对象包括不可变的和实际上不可变的对象。

不变对象和有效不变对象之间有什么区别?


问题答案:

不可扩展且其字段全部为final自身且不可变的类的实例是不可变的。

由于其方法的详细信息而无法更改其字段的类的实例实际上是不可变的。例如:

final class C {
  final boolean canChange;
  private int x;
  C(boolean canChange) { this.canChange = canChange; }
  public void setX(int newX) {
    if (canChange) {
      this.x = newX;
    } else {
      throw new IllegalStateException();
    }
  }
}

的某些实例C实际上是不可变的,而有些则不是。

另一个例子是零长度数组。它们实际上是不可变的,即使它们的包含类不是可证明的不可变的,因为它们中没有元素可以更改。

Joe-
E使用验证程序来证明某些类仅允许不可变的实例。Immutable检查用标记器接口标记的所有内容,并将某些类String((由于它char[]不会逃逸,因此实际上是不可更改的))视为不可变的。

Joe-E:面向安全性的Java子集说

由Joe-E库定义的Immutable接口受到以下语言的特殊处理:Joe-
E验证程序检查实现此接口的每个对象都是(深度)不可变的,如果不能自动将其引发编译时错误。已验证。



 类似资料:
  • 我想确保我正确理解根据Java内存模型的‘有效不可变对象’行为。 假设我们有一个可变类,我们希望将它发布为一个有效不可变的类: 我们执行以下操作: 问题是:Java内存模型是否保证所有线程必须具有? 根据Java并发实践,这应该是正确的,但如果我错了,请纠正我。 3.5.3.安全发布习语 要安全地发布对象,必须同时使对对象的引用和对象的状态对其他线程可见。通过以下方法可以安全地发布正确构造的对象:

  • 问题内容: 我正在努力使可变对象与不可变对象有关。使用可变对象会带来很多负面影响(例如,从方法中返回字符串数组),但是我很难理解它的负面影响。使用可变对象的最佳实践是什么?您是否应尽可能避免使用它们? 问题答案: 好吧,这有几个方面。 没有参考身份的可变对象会在奇数时间导致错误。例如,考虑使用基于值的方法的 : 当实例用作键时,实例在映射中“丢失”,因为实例和相等性基于可变值。这些值在映射之外更改

  • 本文向大家介绍浅谈Python中的可变对象和不可变对象,包括了浅谈Python中的可变对象和不可变对象的使用技巧和注意事项,需要的朋友参考一下 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。变量(准确

  • 问题内容: 我想确保根据Java内存模型正确理解“有效不可变对象”的行为。 假设我们有一个可变的类,我们希望将其发布为有效的不可变的类: 我们执行以下操作: 问题是 :Java内存模型是否保证所有线程都必须具有? 根据 Java Concurrency In Practice, 这应该是正确的,但是如果我错了,请更正我。 3.5.3。安全出版惯用语 为了安全地发布对象,必须同时使对该对象的引用和该

  • 我的目标是让Java对象不可变。我有一个班级< code >学生。为了实现不变性,我用以下方式对它进行了编码: 我的问题是,实现班级不变性的最佳方法是什么?

  • 本文向大家介绍python中可变和不可变之间的区别?,包括了python中可变和不可变之间的区别?的使用技巧和注意事项,需要的朋友参考一下 Python定义了对象的各种数据类型。这些对象存储在内存中,对象的可变性取决于类型,例如列表和字典是可变的,这意味着我们可以更改其内容而无需更改其标识。其他对象,例如整数,浮点数,字符串和元组,都无法更改为索引分配的值。 List是可变的:List就像数组一样