java - 是否存在技术原因导致 Java 中的 Final 不像 C++ 中的 const 那样严格?

标签 java c++ constants final

在 C++ 中,可以使用 const 关键字来指示指向数据的指针或数据本身是否为常量(或两者),即

const SomeClass* p;//数据是常量

SomeClass* const p;//指针是常量

const SomeClass* const p;//两者都是常量

在 Java 中,final 关键字的限制要大得多:

final SomeClass o;//引用是常量,对象可以改变

我一直想知道为什么Java在这方面比C++更受限制。这是语言设计者做出的决定(也可能是其他决定),还是有技术原因阻止它?

Java 对象由垃圾收集器管理的事实对此有影响吗?

最佳答案

第一个原因是 Java Final 的用途与 C++ const 的用途不同。对于它所服务的目的来说,这很好,即作为面向对象类的层次结构的语义限制,以促进此类层次结构的正确设计。这与无法更改类的值/状态没有任何关系。

第二个原因是没有什么可以阻止 Java 拥有某种“const”特性。但它最初是针对非常有限的用例(与当前的各种用例相比有限)而设计的,即以简单的方式在资源有限的微型设备上进行嵌入式计算。考虑到该用例,主要的初始目标之一是编程代码的简单性、虚拟机编程的简单性、编译器编程的简单性等等。而“const”式的复杂性是他们当时不需要的。

从那时起,Java 已经发展了很多,但在向后兼容性和语言教学的简易性方面受到了很大的限制,因此语言(及其运行的 VM 及其框架)的发展是相当谨慎的。 。 (因此,慢慢地。)

并且有一种感觉(合理的),通过声明“const”风格可以获得的很多东西可以通过该语言中的其他面向对象功能获得,例如,字段有 getter,但没有 setter。

因此,语言/VM/框架中没有理由不存在“常量”,除了它还没有被认为与其他需要解决的问题一样重要,并且语言中存在解决方法。

但是人们在 Java 中添加了“const”性质——只是在语言标准之外。查找用于创建“不可变对象(immutable对象)”的各种库和工具,看看可以做什么。

(回答你的最后一个问题:它与 GC 无关。)

关于java - 是否存在技术原因导致 Java 中的 Final 不像 C++ 中的 const 那样严格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60103961/

相关文章:

c++ - 跨平台 Qt 应用程序中的全局热键

iphone - 如何在 Interface Builder 和代码之间共享常量?

c - 用 C 宏定义常量变量

java - 使用什么框架来引导我的第一个生产 Scala 项目?

java - Autowiring 构造函数时 Camel 没有路线

java - 使用 selenium 查找按钮 id

java - 为什么在这种情况下它不执行数学运算?

c++ - 为什么这个 vector 迭代器不能递增?

c++ - 分配给 map 时构造的两个对象

c++ - 将相同的值分配给 const 变量会导致 C++ 中的 UB 吗?