2010-11-12 36 views
0

可能重複:
What is the point of setters and getters in java?爲什麼我們使用一套方法

我有一個關於設置方法的問題。請儘可能提供一些細節。 我想知道爲什麼我們使用set方法和類名。

public class Mymainclass { 

Private class ClassC { 

Private Mysecondclass sec = null; 

public void setMymainclass(Mysecondclass second){ 

     Mymainclass.sec= second; 
    } 
    } 
} 

它只是設置秒變量值嗎?如果是的話爲什麼有班級名稱?

+1

重複的:http://stackoverflow.com/questions/1461598/what-is-the-point-of-setters-and -getters-in-java * java中setters和getters的意義是什麼?* – 2010-11-12 01:06:21

+1

我認爲這不是重複。這不僅是setter和getter問題,而且是set方法,接着是使我感到困惑的classname。 – SilentCoder 2010-11-12 01:41:37

回答

0

在面向對象編程中,一個好的做法是公開getter和setter來允許其他類與類內容交互,而不是公開成員變量。

即使大部分時間,至少在類的第一個版本,不會有更多的有比實際賦值語句,這將允許您以後添加其他行爲:

  • 添加日誌記錄的痕跡知道何時以及如何新的值已設置
  • 做一些控制/之前真的分配給它傳遞的價值轉換(如果其他類提供了什麼空?)
  • 觸發一些其他當這項新任務完成時可能需要採取的行動
  • ...
+0

感謝凱文您的回覆,但我的問題是爲什麼設置方法後面的類名。我知道很多Classname用於創建構造函數。 – SilentCoder 2010-11-12 01:38:35

1

看起來你似乎在類中將「類構造函數」與「setter方法」混淆了。

  • 的主要原因爲一個構造函數並初始化類變量
  • 的setter方法的主要原因是訪問CLAS

所以你的情況的名字裏面的私有變量方法應該是「setSec」而不是setMainClass。 也就是說,如果您想在初始化類後修改私有變量「sec」,那麼您可以選擇使用setter方法。

另一方面,您也可以不使用setter方法,只在第一次創建類時才初始化sec變量。要做到這一點,你將不得不創建一個構造函數。 你的這個類的構造函數將是這樣的:

Mymainclass(Mysecondclass sec){ 
    this.sec = sec; 
} 

這樣,您就可以通過一個Mysecondclass對象,只要你創建Mymainclass的新實例。

還試圖確保何時標註類以使類名中的每個單詞具有如下所示的第一個字母大寫:MySecondClass和MyMainClass!

+0

謝謝shakir,我理解你所描述的構造函數和類名。我知道我們爲什麼使用setter。但我有一個示例代碼,並在該代碼中我已經設置方法後面的類名,正如我在我的代碼中所描述的。這個classname令我感到困惑。我知道classname是一個構造函數,但爲什麼使用set方法呢? – SilentCoder 2010-11-12 01:36:47

1

首先,如果你遵循良好的做法,你的方法應該被稱爲「setSeconds」。只要想一想,如果你在班上增加了一名會員,就會有多混亂。

編碼設置者和獲取者有兩個主要原因。

第一個是實用的。如果你想調用內省和java bean的魔力,那麼你需要遵循這些約定。有幾個像FreeMarker這樣的庫/ API絕對依賴於在你的類中擁有getter和setter方法。

第二個更多的是與良好的設計。考慮你有一個名爲秒的公衆成員。你班的任何用戶都可以通過編碼來設置。

instanceOfYourClass.seconds = 60; 

這只是很好,除了你可能想對這個值施加42秒的任意限制。要驗證該值並將其設置爲最大值42秒,您現在需要一種方法來執行此操作。所以,你班的每一個用戶必須改變現在thier代碼: - 因此,通過建立從你正在建設中都的flexibilty到您的類中做更多的外來事物的開始getter和setter

instanceOfYourClass.setSeconds(60); 

,而在同時爲你的班級用戶提供一個穩定的接口,在每次功能發生微小變化時,他們都不會讓他們改變他們的代碼。

+0

代碼有一些變化。 Plz現在檢查它。 – SilentCoder 2010-11-12 16:54:37

1

我認爲你的混淆源的一部分是你給的例子是壞代碼!您不會根據參數的類別命名setter,而是根據您設置的對象的屬性對其進行命名。例如,你的榜樣的標準地「正確」的版本是:

public class Mymainclass { 

private Mysecondclass sec= null; 

public void setSec(Mysecondclass second){ 

     this.sec= second; 
    } 
} 

具有映射到屬性名稱制定者允許各種不同的框架,從UI到持久性和全部之間以抽象的方式操縱你的對象。例如,如果告訴數據庫層,名爲'sec'的屬性映射到特定的數據庫列,則可以使用反射來查找名爲「setSec」的方法併爲您設置它!

當你有很多相同類型的屬性,很多String s,很多BigDecimal s,無論如何,有很多剛剛命名爲'set'的方法的想法也會崩潰。如果有兩種標準只在可能時才使用「set」,並在必要時使用屬性名稱,那將會非常奇怪。 (並且你會發現自己經常重構那些'設置'唯一的方法。)

+0

代碼有一些變化。請立即檢查。 – SilentCoder 2010-11-12 16:52:27

相關問題