常量对象与不可变对象

时间:2011-02-16 17:17:20

标签: java immutability

我可以在术语“不可变对象”的位置使用术语“常量对象”吗?虽然我觉得对象的Immutable是变量的常量,但我不确定这个术语是否被接受。请帮我理解。

谢谢, Karthick S。

5 个答案:

答案 0 :(得分:11)

事实上,在Java中,术语常量没有明确的含义。它仅在较大的术语编译时常量表达式中出现在JLS中,这是一个可以(并且必须)由编译器而不是在运行时计算的表达式。 (保留关键字const以允许编译器提供更好的错误消息。)

在Java中,我们使用术语 final 来引用无法更改的变量(无论是类,对象还是本地的),以及 immutable 指的是无法改变的对象。在谈到变量x时都可以使用它们 - 第一个意味着变量本身(意味着它不能切换到另一个对象),第二个意味着变量后面的对象。因此,这里的两个含义是正交的,并且通常组合在一起以创建“真正的常量”

答案 1 :(得分:4)

我会将常量视为同一个对象(相同的引用),而 immutable 对我来说显然意味着对象不会改变。

由于这些是两件不同的事情,我或许可以参考:

private final Immutable i = new Immutable();

作为一个常量不可变对象。

答案 2 :(得分:1)

它们的含义非常接近,理解为Object包含方法,而Constant通常被认为只包含数据。

在Java中,还有对关键字final的额外考虑,这基本上意味着不可重新分配。有些人会随便将最终变量称为常量(因为它对特定对象的引用是常量。这通常是由于对成员及其引用的对象的特定角色的混淆,因为95%的时间一个人这样做是为了引用一个不可变的对象。

并非每种方法都返回完全取决于内部成员的数据。例如,System.currentTimeMillis()返回类似时间戳的Unix,但不需要更改实际的“系统”对象。

答案 3 :(得分:1)

常量在不同的编程语言中通常具有非常特定的含义。在java中,常量已经引用了一个常量变量,一个在赋值后无法更改的变量,例如:

final int FOO = 1;
FOO = 4; // constant variable cannot be changed.

不可变对象是一个常量对象,因为它的属性永远不会被改变,但当然,常量变量指向的对象仍然可以改变。因此,为避免混淆,使用术语“不可变”(字面意思是“随时间不变”)。

答案 4 :(得分:-2)

对象的不变性意味着它无法改变它的状态......即不能变异......对于考试

final class Person {
  private int age = 0;

  public Person(int age) { this.age = age; }
}

此类型的对象是不可变对象,因为您无法更改其状态....(暂时忘记反射)

另一方面,常量编程意味着内联...即使编译器也会这样做,它们为主要类型内联常量变量的值...对于对象类型,它意味着不能重新分配ref变量。

相关问题