常量对象与不可变对象

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

谢谢,Karthick S.

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

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

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

由于这些是两个不同的东西,我可能会提到这个:

 private final Immutable i = new Immutable(); 

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

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

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

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

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

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

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

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

 final class Person { private int age = 0; public Person(int age) { this.age = age; } } 

这种类型的对象是不可变对象,因为你不能改变它的状态….(暂时忽略reflection)

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