2014-09-11 33 views
2

或者它取決於?我應該在類實現中使用getter和setter嗎?

例如虛構類:

public class Worker { 

    private boolean paused; 

    public boolean isPaused() { 
     return paused; 
    } 

    public void onIteration() { 
     if (!paused) { 
      doIteration(); 
     } 
    } 

} 

或者它會更好,如果我在上面的例子中使用if isPaused() { }

是否有關於我總是必須使用的規則?

+0

您可以同時使用兩種方式,但如果它正在做一些額外工作(除了剛剛返回暫停狀態),您應該使用'isPaused'。 – 2014-09-11 12:43:41

+2

由於Worker可以被子類化,並被重寫,所以最好使用isPaused(),除非重寫這個功能是錯誤的,在這種情況下,你應該讓isPaused final – ControlAltDel 2014-09-11 12:44:45

回答

3

我會使用getter,因爲它決定了內部邏輯。在你的情況下,沒有太多的邏輯,你只需返回值。

但考慮在isPaused將改爲一個情況:

public boolean isPaused() { 
    return isReallyPaused(paused); 
} 

另一個原因,我更喜歡使用干將

如果它是一個int,我不會採取改變的機會它錯了,而不是寫if(myInt == 5)(可能是=錯誤),我會用if(getMyInt() == 5)

1

那麼作爲一個規則總是使用getters。 爲什麼?

可以說你已經成爲了一個公共成員,並且在這個類的5個用法之後,你決定現在你需要添加更多的邏輯來解決這個問題。

現在只有在A和B時才暫停。 也許用戶沒有權限查看isPauesd是true還是false。

如何在不打破課堂外部使用的情況下改變這一點?

你不能,但如果你使用一個getter那麼它不是問題:

public boolean isPaused() { 
    if (hasPermissions){ 
     return isPaused; 
    } 

    throw newPermissionException(); 
} 

我是一個打破慣例改變了代碼。實際上,這個類的用戶甚至不知道這個變化。

這被稱爲封裝。

+0

_讓你說它是public_ + _這叫做encapsulation._ - 但我寫了關於在**類**實現**內使用**,**不在外面**。 – 2014-09-11 13:03:54

相關問題