为什么可以更改最终对象的值?

时间:2016-04-15 21:37:19

标签: java class object final setter

我有一个Java Class Point。为了快速访问点(0,0),我为它提供了一个常量。

public class Point{
    //...
    public static final Point NULLPOINT=new Point(0, 0);
    //...
}

但是,此Point.NULLPOINT.setX(x)仍然有效并将NULLPOINT更改为(x,0)。有办法防止这种情况吗?我认为最终会阻止这一点,但显然我高估了它的力量。

2 个答案:

答案 0 :(得分:2)

final保证引用不会更改,即您无法将另一个Point对象重新分配给NULLPOINT引用。但是你仍然可以改变对象状态。如果您需要确保NULLPOINT状态不会更改,则应使Point类不可变:例如删除setter。

答案 1 :(得分:0)

因为Java中的所有对象变量都是对象的引用,所以使NULLPOINT为final意味着没有人可以更改NULLPOINT引用的Point。 java.awt.Point类是可变的,但是你可以做一些事情来实现类似的效果。

首先,您可以声明NULL_X和NULL_Y值,并将任何其他Point的x和y值与这些值进行比较。其次,您可以使用没有setter的NULLPOINT所需的所有方法来实现ImmutablePoint类。第三,你可以写一个nullpoint()函数,它返回一个新的Point at(0,0)。

所有这些选项在性能和易用性方面都有其优势和劣势。