常量对象与不可变对象
我可以在术语“不可变对象”的位置使用术语“常量对象”吗? 虽然我觉得对象的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变量。
- 如何组成Observable以避免给定的嵌套和依赖回调?
- Java Swing – 具有3种状态的JCheckbox(完全选中,部分选中和取消选择)
- 如何在eclipse中设置spring源代码进行调试
- Eclipse中Interactive Interactive的用法是什么(Debug视图)
- Java 9 + maven + junit:测试代码是否需要自己的module-info.java以及放置它的位置?
- java中相同代码块的运行时间不同。 这是为什么?
- 在外部类java中使用内部类对象
- Spring Data Rest:在一对多关系中调用post后,外键更新为null
- 在新的浏览器选项卡中打开ResponseEntity PDF