虽然数组引用可以声明为final,但数组的元素却不能。
类似地,虽然对象引用可以声明为最终字段,但它引用的对象仍然可以是可变的。为什么会这样?
最佳答案
将对象声明为 const,而不是指针,会产生巨大的影响。为了确保不变性,包含 const 声明的代码不能通过此引用修改字段是不够的,不允许在该对象上调用任何可以修改该对象的方法。因此,每个方法都必须标记为可能修改 this
实例或保证不修改它。
请注意,const
属性仍然不是对象本身的属性。可能存在对同一对象具有非 const 引用的代码,允许对其进行修改。此类代码可以将非 const
引用传递给通过带有 const
修饰符的引用访问对象的代码,但反之则不然。
因此,这意味着 const 对象不得分配给另一个缺少所引用对象的 const 修饰符的变量。此正式限制不仅适用于字段,还适用于所有局部变量、参数和返回类型。
现在回想一下 90 年代初,当时 Java 中还没有泛型。 Collection
类都只是存储 Object
。在这种情况下,对 const 修饰符的支持意味着此类 const 对象永远不能存储在任何集合中,因为无法保证不检索到相同的对象来自该集合(作为普通Object
)并分配给非const
变量。
从 Java 8 开始,您可以注释任何类型的使用,包括 Collection
的通用元素类型或实例方法接收的 this
引用。这允许使用审计工具来实现 const 功能作为 @Const 类型注释,并使用注释验证代码的 const 正确性。但是,由于所有现有 Java 代码的方法不太可能突然被标记为 const
安全或不安全,因此今天不太可能将这样的功能添加到标准中。
关于java - 为什么最终没有扩展到适用于数组和引用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077935/