java - 为什么最终没有扩展到适用于数组和引用的对象?

标签 java final

虽然数组引用可以声明为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/

相关文章:

java - Final 局部变量与 while 循环一起使用时出现不同的编译错误

java - 如何在 Storm 拓扑初始化时初始化我们的类?

java - 关于在对象的构造函数完成之前引用对象

java - Java中使用final关键字会提高性能吗?

Java字节码最终字段赋值(jasmin)

java - 通用辅助方法与直接类转换?

java - 如何因 Firebase 存储中的文件大小限制规则而出现拒绝上传错误

java - Java中的静态成员

java - e(fx)剪辑 : preference page with javafx