为什么Java中没有常量功能?

2022-08-31 07:34:06

我试图找出Java中常量背后的原因,我已经了解到Java允许我们使用关键字声明常量。final

我的问题是为什么Java没有引入常量()功能。由于许多人说它来自C++,因此C++我们有关键字。constconst

请分享您的想法。


答案 1

每次我从繁重C++编码到Java时,我都需要一点时间来适应Java中缺乏恒定性。C++中的这种用法与仅仅声明常量变量有很大不同,如果你不知道的话。从本质上讲,它确保通过一种称为const-pointer的特殊类型的指针访问对象是不可变的 当在Java中,在我通常想要返回const指针的地方,我而是返回一个引用,其接口类型仅包含不应该有副作用的方法。不幸的是,这不是由语言强制执行的。const

维基百科提供有关该主题的以下信息:

有趣的是,Java语言规范将const视为保留关键字 - 即不能用作变量标识符的关键字 - 但没有为其分配语义。据认为,关键字的保留是为了允许Java语言的扩展包括C++样式的const方法和指向const类型的指针。Java社区进程中用于在Java中实现const正确性的增强请求票证于2005年关闭,这意味着const正确性可能永远不会进入官方Java规范。


答案 2

const是什么意思
首先,要意识到“const”关键字的语义对不同的人来说意味着不同的东西:

  • 只读引用 - Java 语义 - 引用变量本身无法重新分配以指向另一个实例(内存位置),但实例本身是可修改的final
  • 只读引用 - C 指针/引用语义 - 表示此引用不能用于修改实例(例如,不能分配给实例变量,不能调用可变方法) - 仅影响引用变量,因此指向同一实例的非 const 引用可以修改实例const
  • 不可变对象 - 表示实例本身无法修改 - 适用于实例,因此不允许或不能使用任何非 const 引用来修改实例
  • 上述的某种组合
  • 其他

为什么或为什么不反对
第二,如果你真的想深入研究一些“赞成”与“反对”的争论,请参阅此增强请求(RFE)“错误”下的讨论。此 RFE 请求“只读引用”类型的“const”功能。1999年开放,然后在2005年被Sun关闭/拒绝,“const”话题引起了激烈的辩论:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070

虽然双方都有很多很好的论点,但一些经常被引用(但不一定是令人信服或明确的)反对理由包括:const

  • 可能具有可能被误用和/或滥用的令人困惑的语义(请参阅上面的const是什么意思
  • 可能复制其他可用功能(例如,设计一个不可变的类,使用不可变的接口)
  • 可能是特征蠕变,导致需要其他语义变化,例如支持按值传递对象

在有人试图争论这些是好理由还是坏理由之前,请注意这些不是我的理由。它们只是我从浏览RFE讨论中收集的一些原因的“要点”。我自己不一定同意他们的观点 - 我只是试图引用为什么有些人(不是我)可能会觉得关键字可能不是一个好主意。就个人而言,我希望以明确的方式将更多的“const”语义引入语言中。const


推荐