将"const"变量传递给Java中的方法

LK.*_*LK. 11 c++ java syntax const

在Java中是否存在与C++中传递const引用相当的等价物?
是不是遗漏了关于方法签名的"常量"误导?

qua*_*dev 15

不,没有.

Java"final"并不完全等同于C++"const".以下(最终变量的延迟初始化)在Java中起作用:

final double x;
int w = 1;
if (w > 2)
{
    x = 0.5;
}
else
{
    x = - 0.5;
}
Run Code Online (Sandbox Code Playgroud)

但它在C++中不起作用,"final"替换为"const".

在方法声明中对变量使用"final"在Java中很有用,因为允许您在方法内创建的任何匿名类中使用此变量.

PS.我首先对Java中缺乏"const"感到失望,但后来学会了与"最终"一起生活.

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

1)它从"未定义"更改为"已定义",但编译器将告诉您是否在初始化之前引用它

2)在Linux上,当存储在寄存器中时,double具有80位精度,而当存储在存储器中时则为64位.当最终的双变量被推出寄存器时,它将被截断并改变其值.正如Joel Spolsky所说,"抽象已经出现了泄漏".


Jon*_*eet 8

Java没有像C++的const概念那样的东西.这是一个争论点,虽然有趣的是注意到.NET也没有.我相信原因是:

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


Pet*_*rey 5

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