代码之家  ›  专栏  ›  技术社区  ›  LK.

在Java中传递“const”变量到方法

  •  11
  • LK.  · 技术社区  · 16 年前

    在Java中是否有一个等价于C++中的const引用传递?
    是否遗漏了方法签名的“常量”误导?

    6 回复  |  直到 16 年前
        1
  •  15
  •   quant_dev    16 年前

    不,没有。

    Java“最终”并不是C++的“const”。下面的(最终变量的延迟初始化)在Java中工作:

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

    但是在C++中,用“const”代替“最后”是不起作用的。

    在方法声明中使用变量的“最终”在Java中是有用的,因为允许您在方法内部创建的任何匿名类中使用此变量。

    我首先对爪哇缺乏“康斯特”感到失望,但后来学会了“最后”。

    PS2。Java词汇表 http://mindprod.com/jgloss/immutable.html )在这个线程中链接到有一件事是错误的:不,没有给您100%的保证,最终变量不会改变其值:

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

    2)在Linux上,double在寄存器中存储时精度为80位,在内存中存储时精度为64位。当最后一个双变量被推出寄存器时,它将被截断并更改其值。正如JoelSpolsky所说,“抽象已经产生了一个漏洞”。

        2
  •  8
  •   Jon Skeet    16 年前

    Java没有任何类似C++的const概念。这是一些争论的一点,尽管有趣的是.NET也没有。我认为原因是:

    • 获得可理解的语法变得相当困难(IMO)-要区分可变字符串生成器的const列表和可变const字符串生成器列表等是很困难的。(当然,我在C++中发现它很难,虽然这可能是由于缺乏实践。)
    • 我强烈地怀疑,允许使用托管语言丢弃consstness是不可接受的。这会影响到整个事情。在很多情况下,这会使他们更难相处。
    • 在执行时传播有关constness的信息(以避免它被丢弃的可能性)在性能方面可能是困难的和/或昂贵的。
    • 由于Java(和.NET)在过去没有稳定,所以在游戏后期引入它。 巨大地 困难-除非所有的公共库都支持它(并得到它 正确的 每一步!)最后你会遇到一个令人讨厌的混乱,实际上,如果你需要使用两个库,这可能是完全不可行的,其中一个库不知道constness,另一个库只提供const值。
        3
  •  5
  •   Peter Lawrey    16 年前

    BTW:Java确实有 康斯特 作为关键字,但不能在任何地方使用。

        4
  •  1
  •   WolfmanDragon    16 年前

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

    public static final Object x = somedata;
    

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

        5
  •  1
  •   Naveen    16 年前

    在Java中实现这一点,请参见此: Immutable objects in Java

        6
  •  0
  •   Brian Matthews    16 年前

    最接近的Java等价物 const final .

    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 = ...;
    }