2012-06-17 19 views
29

可能重複:
Why use getters and setters?優勢set和get方法VS公共變量

有什麼優勢,製作方式來訪問你的類私有變量,而不是使變量公衆?

例如第二種情況比第一種好嗎?

//Case 1 
public class Shoe{ 
    public int size; 
} 

//Case 2 
public class Shoe{ 
    private int size; 
    public int getSize(){ 
     return size; 
    } 

    public void setSize(int sz){ 
     size = sz; 
    } 

} 
+0

可能重複的[爲什麼使用getters和setters?](http://stackoverflow.com/questions/1568091/why-use-getters-and-setters )和[自動實現的獲取器和設置器與公共字段](http://stackoverflow.com/questions/111461) –

回答

59

我已經有一天看到那麼,作爲答案(由@ ChssPly76寫的)爲什麼要因爲從2現在周(月,年)當你意識到使用getter和setter

您 制定者需要做的不僅僅是設置的值,你也會意識到 該財產已直接應用於其他238類:-)

有更多的優勢:

  1. 的getter和setter 可以在他們的驗證,字段不能
  2. 使用getter可以得到所需類的子類
  3. getter和setter 是多態,字段不爲
  4. 調試可以簡單得多,因爲斷點可以放在裏面一個方法是某一領域的並不附近有許多引用。
  5. 他們可以隱藏實現改變

前:

private boolean alive = true; 

public boolean isAlive() { return alive; } 
public void setAlive(boolean alive) { this.alive = alive; } 

後:

private int hp; // change! 

public boolean isAlive() { return hp > 0; } // old signature 
//method looks the same, no change in client code 
public void setAlive(boolean alive) { this.hp = alive ? 100 : 0; } 

編輯:當你使用的是Eclipse一個額外的新advange - 你可以在現場創建觀察點,但如果你有需要的話只是一個斷點,並且... 斷點(例如,在setter方法中)可以是有條件的,觀察點(在現場)不能。所以如果你想停止你的調試器,只有在x=10的情況下,你才能用setter中的斷點來完成。

+0

獲取器和設置器的好的部分(http://pawel-michalski-javnie.blogspot.de/2012 /04/gettery-settery-enkapsulacja-czy.html)一點都不好笑......爲什麼給它一個英文標題,並繼續一些奇怪的語言... –

+1

@MatthisKohli對不起,你是對的。我刪除了該鏈接。 – dantuch

4
  1. 有些程序庫要求這樣做才能實現「Java Bean標準」。
  2. 一個setter/getter可以在一個接口中,一個屬性不能在一個接口中
  3. Setter/getters可以很容易地在後代類中被覆蓋。
  4. 制定者/吸氣抽象掉的值是否按要求或只是一個訪問到一個屬性
6

使用公共變量可能會導致錯誤的值設置爲變量計算爲輸入值不能檢查信息。

例如:

public class A{ 

    public int x; // Value can be directly assigned to x without checking. 

    } 

使用設定器可以用來設置變量與檢查輸入。保持實例varibale私人和getter和setter公衆封裝 吸氣的形式和setter也與Java組件標準兼容,

getter和setter也 有助於實現多態的概念

如:

public class A{ 

    private int x;  // 


     public void setX(int x){ 

     if (x>0){      // Checking of Value 
     this.x = x; 
     } 

     else{ 

      System.out.println("Input invalid"); 

     } 
    } 

     public int getX(){ 

      return this.x; 
     } 

多態例如:我們可以assig n作爲調用方法的參數的子類型的對象參照變量被調用方法的超類參數的對象參照變量。

public class Animal{ 

     public void setSound(Animal a) { 

      if (a instanceof Dog) {   // Checking animal type 

       System.out.println("Bark"); 

      } 

     else if (a instanceof Cat) {  // Checking animal type 

       System.out.println("Meowww"); 

      } 
     } 
     } 
0

有些倒退的看待事物的方式。

是否有任何情況下最好通過公開成員變量來暴露你的課堂的內部運作情況,因此任何消費者都可以做到設計師從未想過的事情,從而導致失敗的盛宴和聚寶盆的聚寶盆崩潰?

答案本身真的不是嗎?

OO的基本原理,封裝。一個公共成員變量基本上是全局變量,前綴...

+4

有很好的理由不使用getter和setter - 它們混淆了代碼,使其更難閱讀,並且違反了DRY原則。事實上,在具有屬性的語言中,通常只是公開事物(因爲如果真的有必要,它可以重構爲屬性)。 – Antimony

+0

@銻。不是辯論的地方,但我不同意,甚至沒有一點點。我看到太多的實例是那種'erm快捷方式,導致了更多的工作,而不僅僅是重構一個屬性。很多,更多。 –