我可以通過2種方式調用變量。從另一個類獲得變量的正確方法
一個就是做這樣的:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
而另一種方法是使用一個getter這樣的:
myLocalVar = myClass.getMyVarVal();
這兩種方法都工作正常,但我想知道什麼將會是最有效/最恰當的方式嗎?
感謝
我可以通過2種方式調用變量。從另一個類獲得變量的正確方法
一個就是做這樣的:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
而另一種方法是使用一個getter這樣的:
myLocalVar = myClass.getMyVarVal();
這兩種方法都工作正常,但我想知道什麼將會是最有效/最恰當的方式嗎?
感謝
這兩種技術都是可怕的工作,但使用的吸氣劑常見的(更安全)的做法,將是很好的使用它。
爲了訪問類的公共數據成員(a.k.a. public field或public property),您必須知道類的實現細節(數據成員名稱和數據成員類型)。這是一件壞事;它打破了OOP的概念「信息隱藏」並增加了「耦合」。
使用getter也很糟糕(如在一個糟糕的OOP實踐中),因爲對象不僅僅是數據的包裝;對象應該封裝功能和數據。 「在此存儲此值以便我可以稍後獲取」不是功能;它是嗡嗡聲功能(就像籠子裏的猴子一樣)。吸氣者;然而,在java(以及其他OOP-lite語言,如C++和c#)中被廣泛接受。爲了避免你認爲我是一些象牙塔最純淨的,我當然使用了吸氣劑;我使用java,所以我使用getters。如果你使用getters,你不是一個「好的程序員」,你只是不相信「IR gud OOP Prgmr」,因爲如果你使用getters,你不是一個「好的程序員」一個完成工作的程序員。
編輯:也許是一個更好的辦法。
更好的方法是不使用getter,而是設計你的類,使它們暴露功能而不是數據。在實踐中,這有一個地方在這裏崩潰;例如,如果您需要在JSP頁面上顯示地址,則可以使用該地址將bean放入請求(或session或blah)中,並使用getter公開這些值。 「更純粹」的方式是將一個暴露的「顯示地址到jsp」功能的bean。
編輯2:也許是一個更好的例子。
假設我在美國的一家電話公司工作,而且我有一個代表客戶電話號碼的對象。這可能看起來如下:
public class CustomerPhoneNumber
{
private String npa; // numbering plan area (google search nanp for more details)
private String nxx; // exchange.
private String serviceNumber;
public String toString()
{
return "(" + npa + ") " + nxx + "-" + serviceNumber;
}
public boolean equals(Object object)
{
... standard equals implementation (assume this works)
}
}
現在說我得到一個電話號碼從網頁形式String inputPhoneNumber
的輸入。爲了討論的目的,接收這個輸入的類被稱爲「servlet」。
我該如何回答這個問題:「我的CustomerPhoneNumber對象列表中的輸入電話號碼是否?」
選項1使npa,nxx和serviceNumber數據成員公開並訪問它們。這很糟糕。
選項2爲npa,nxx和服務編號提供getters並將它們與輸入進行比較。同樣可怕的是,內部的細節暴露了太多。
選項3提供了一個返回格式化電話號碼的getter(我把它稱爲toString())。這更聰明,但仍然很糟糕,因爲servlet必須知道getter將使用的格式,並確保輸入格式相同。
選項4(我稱之爲「歡迎使用OOP」)提供了一種方法,它接受一個字符串,並且如果與客戶服務號碼匹配則返回true。這是更好,可能是這樣的(名字很長,但足以讓這個例子):
public boolean doesPhoneNumberMatchThisInput(final String input)
{
String formattedInput;
String formattedCustomerPhoneNumber = npa + nxx + serviceNumber;
formattedInput = ... strip all non-digits from input.
return StringUtils.equals(formattedCustomerPhoneNumber, formattedInput);
}
這是贏家,因爲沒有實施細節被曝光。也可以使用toString在JSP頁面上輸出電話號碼。
StringUtils是Apache Commons Lang的一部分。
那麼有沒有更好的方法,或者只是一個必要的邪惡? – SkyeBoniwell 2012-02-09 15:01:30
這裏有一篇[優秀的文章](http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html),供那些尋求更全面解釋的人蔘見*一個球和一個狗*部分爲一個非常容易理解的比喻。) – 2015-07-20 08:59:03
總是使用getter和setter來訪問你的屬性!
你也應該看看this。
myClass.getMyVarVal()
比較慢,因爲它是一個方法調用,所以它在棧上創建返回值的入口等等。但是使用getter更好的是OOP實踐。
Java語言並沒有規定應該像這樣實現方法調用。實際上,這種方法最有可能會被內聯。 – aioobe 2012-02-09 14:46:14
myLocalVar = myClass.getMyVarVal();
,如果你是OOP
概念
只需創建對象並object.variablename;
或object.methodName();
可用於製作非靜態引用...不需要使用getter。
大量資源[here](http://stackoverflow.com/q/1568091/387852),[here](http://stackoverflow.com/q/565095/387852)和[here](http ://stackoverflow.com/q/996179/387852)。 – 2012-02-09 14:46:17
但是如果我有50個描述對象的變量,該怎麼辦?例如,假設我有一個名爲Car的對象,然後我有一些變量,如carType,carColor,carHP,carMaker,carName,carWheelBase,carMPG,carTransmission,carEngine等等。我是否需要創建一個getter和每個人的二傳手?這似乎是一個額外的編碼噸... – SkyeBoniwell 2012-02-09 14:58:30
現代的IDE(如Eclipse)可以做到這一點自動。但是你也應該問自己,你是否需要將這些變量暴露給外部世界。你違反封裝的好原則嗎? – 2012-02-09 15:08:01