2016-04-15 43 views
-3

我有一个Java Class Point。为了快速访问该点(0,0),我为它提供了一个常数。为什么可以改变最终对象的值?

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

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

+5

您不更改对象引用,但它的内部属性 – MadProgrammer

+4

“最终”标记表示变量NULLPOINT不能被重置为指向另一个点,而不是现有的NULLPOINT的内容不能被更改。 – FredK

回答

2

final保证参考不会改变,即您将不能重新分配另一个Point对象到NULLPOINT参考。但是你仍然可以改变对象状态。如果您需要确保NULLPOINT状态不会改变,您应该使Point类不可变:例如删除setter。

+0

我认为如果你说“参考”是最终的,而不是那个参考文献的内容,它会更清楚。 –

0

因为Java中的所有对象变量都是对象的引用,所以最终形成NULLPOINT意味着没有人可以更改Point NULLPOINT引用的内容。 java.awt.Point类是可变的,但有一些事情可以做到,以达到类似的效果。

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

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

+0

ImmutablePoint的提示看起来很好,是否可以从Point中放进去并禁用所有的setter而不用空的覆盖它们(如果你知道我想说的话,一种将它们排除在意愿之外的方法)? – user3284214

+0

我相信,空洞覆盖它们是实现它的唯一方法,而这是一个丑陋的解决方案。此外,Point的x和y字段是公开的,所以即使没有这些方法,它们也可以改变。 – GaiusOctavian

相关问题