2016-04-15 39 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

相關問題