12

Java 中是否存在与 C++ 中传递 const 引用的等价物?
在方法签名方面是否遗漏了“常量”误导?

4

6 回答 6

15

不,没有。

Java“final”不完全等同于 C++“const”。以下(最终变量的延迟初始化)在 Java 中有效:

final double x;
int w = 1;
if (w > 2)
{
    x = 0.5;
}
else
{
    x = - 0.5;
}

但它不适用于将“final”替换为“const”的 C++。

在方法声明中的变量上使用“final”在 Java 中可能很有用,因为允许您在方法内创建的任何匿名类中使用此变量。

PS。我最初对 Java 中缺少“const”感到失望,但后来学会了接受“final”。

PS2。该线程中链接到的 Java 词汇表 ( http://mindprod.com/jgloss/immutable.html ) 有一个问题:不,您没有 100% 保证最终变量不会改变其值:

1)它从“未定义”变为“已定义”,但编译器会告诉你是否在初始化之前引用它

2) 在 Linux 上,存储在寄存器中时 double 具有 80 位精度,但存储在内存中时具有 64 位精度。当最终的 double 变量被推出寄存器时,它将被截断并更改其值。正如乔尔·斯波尔斯基(Joel Spolsky)所说,“抽象出现了漏洞”。

于 2009-02-02T07:44:31.640 回答
8

Java 没有 C++ 的 const 概念。这是一些争论的焦点,尽管有趣的是 .NET 也没有。我相信原因是:

  • 获得可理解的语法变得非常棘手(IMO) - 区分可变 StringBuilders 的 const 列表和 const StringBuilders 等的可变列表之间的区别是困难的。(我当然发现在 C++ 中很难,尽管这可能是由于缺乏实践。)
  • 我强烈怀疑允许在托管语言中抛弃常量是不可接受的。这将违背整个事情的本质。在许多情况下,这可能会使他们更难合作。
  • 在执行时传播有关 constness 的信息(以避免它被丢弃的可能性)在性能方面可能很困难和/或昂贵
  • 由于 Java(和 .NET)过去没有 constness,因此在游戏后期引入它是非常困难的 - 除非所有常见的库都支持它(并且每一步都正确!)你最终会得到一个令人讨厌的混搭,如果您需要使用两个库,其中一个不知道 constness 而另一个只提供 const 值,则确实可能完全不可行。
于 2009-02-02T07:39:52.647 回答
6

顺便说一句:Java 确实有const作为关键字,但你不能在任何地方使用它。

于 2009-02-02T08:52:16.153 回答
1

请参阅此以在 Java 中实现此目的:Java 中的 不可变对象

于 2009-02-02T07:31:04.053 回答
1

如上所述,Java 中没有 const。但是当我们想在 Java 中实现“接近”相同的结果时,我们使用

public static final Object x = somedata;

这会在该点设置数据并暴露抽象泄漏等,您可以获得尽可能接近的等价物。

于 2009-02-02T07:57:05.873 回答
0

最接近的 Java 等价物constfinal.

void func(final SomeClass x) {
  // The following causes a compiler error
  x = ...;

  // The following works. If you don't want it to, then you have to make
  // somevar final or write a getter (but not a setter) for it in SomeClass.
  x.somevar = ...;
}
于 2009-02-02T07:36:16.867 回答