我有一个Java Class Point。为了快速访问点(0,0),我为它提供了一个常量。
public class Point{
//...
public static final Point NULLPOINT=new Point(0, 0);
//...
}
但是,此Point.NULLPOINT.setX(x)仍然有效并将NULLPOINT更改为(x,0)。有办法防止这种情况吗?我认为最终会阻止这一点,但显然我高估了它的力量。
答案 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)。
所有这些选项在性能和易用性方面都有其优势和劣势。