在C++中,可以使用const关键字来指示指向数据的指针或数据本身是常量(或两者都是),即
const SomeClass* p; //数据为常量
或
SomeClass* const p; //指针为常量
或
const SomeClass* const p; //两者都是常量
在Java中,final关键字的限制要多得多:
final SomeClass o; //引用为常量,对象可以更改
我一直想知道为什么Java在这方面比C++更有限。这是由语言设计者做出的决定(也可能是另一种决定),还是有技术原因阻止了它?
Java对象由垃圾收集器管理这一事实在这里有影响吗?
发布于 2020-02-07 06:24:01
第一个原因是Java final与C++ const的用途不同。它服务的目的是对面向对象类的层次结构进行语义限制,以促进这种层次结构的正确设计,这是很好的。这与不能更改类的值/状态没有任何关系。
第二个原因是,没有任何东西可以阻止Java具有某种"const“特性。但它最初是为一个非常有限的用例而设计的(与它目前的各种用例相比是有限的),即以一种简单的方式在资源有限的微型设备上进行嵌入式计算。考虑到这个用例,主要的初始目标之一是简化编程代码,简化虚拟机编程,简化编译器编程,等等。而"const"-ishness是他们当时不需要的复杂性。
从那时起,Java发生了很大的变化,但与向后兼容性和语言教学的简易性相关的限制很大,因此该语言(以及它所运行的VM和它的框架)的发展是相当谨慎的。(因此,慢慢地。)
而且有一种感觉(有理由),声明"const"-ishness会得到很多东西,可以从语言中的其他面向对象功能中获得,例如,有字段的getters,但没有setter。
因此,没有理由不在语言/VM/框架中使用"const"-ishness,除了它还没有被认为像解决其他事情一样重要,而且在语言中有变通方法。
但是人们已经在Java中添加了"const"-ishness --只是语言标准的外部。查找用于创建“不可变对象”的各种库和工具,看看可以做些什么。
(回答您的最后一个问题:它与GC无关。)
https://stackoverflow.com/questions/60103961
复制相似问题