JavaBean的get、set方法引發的討論
阿新 • • 發佈:2019-02-04
get set方法的使用,我們已經很熟悉了。甚至有點太熟悉,於是理所當然的用,也沒認真考慮過為什麼要用它。最近在set的時候,寫了這樣一個方法
private java.util.List<OscKepler> out;
public List getOutput(){
return this.out;
}
public void setOutput(OscKepler t){
this.out.add(t);
}
結果發現不對,原來set方法的引數必須和生命的變數是一樣的,比如上面需要是下面:
關於get,set方法的意義參考以下貼子:public void setOutput(List<OscKepler> t){ this.out= t; }
轉自http://kennethf6986.iteye.com/blog/828179
一日,一個兄弟發了一個被大家廣泛認為蛋疼的帖子,如下:
Java程式碼- {
- private String code; //設定成私有變數,有什麼鳥用? 難道是為了整個團隊配合的時候告訴那些人這個變數不可以動嗎? 那是不是一個開發一個專案的時候 這些 修飾符 是毫無意義的?
- public void setCode(String code){
- this.code=code;
-
}
- }
為什麼要寫一個方法去給變數賦值?
不能直接吧code變數設定成public 用 obj.code 去賦值嗎? 搞不懂,是瞎折騰嗎?
引發以下的精彩回帖。話說本帖被評為精華貼,其實是回帖裡頭有精華。
同學一
這是java的風俗。就好比所有人都在放屁之前脫褲子的社會裡,你不脫就是新手。
實際情況確實多數getter/setter都是沒有用的。
以OO流派的說法,物件的狀態都因該是私有的,物件之間只有message,這就是這個風俗的理論基礎。
同學二
1.懂OOP的程式設計師,會告訴你,這樣做為了封裝..
2.做過3-5年Java企業專案的人,並被客戶需求虐待過的同學會告訴你,這樣做為了程式易於修改、維護
3.懂模式設計的合格程式設計師,會告訴你,這樣寫能擴充套件成觀察者模式,備忘錄模式。。。
4.做過架構設計的牛人,會告訴你,一切為了卸耦..
同學三
很簡單,當你有一天需要加入一下條件或者鉤子操作的時候你就知道好處啦。
比如現在你寫成public的,所有的地方都直接訪問,有一天,你需要在這個屬性改變的時候做一些觀察者的操作,比如發郵件通知,或者其他操作的時候你就杯具啦,你必須在工程中search到底多少地方呼叫過,並且在每個後面去加上一段sendEmailIfChange(userid,contents)程式碼,但是如果是封裝了,就直接在set裡面判斷ifChange然後改了。
哪個好,你懂的。
同學四
private 恰恰告訴你,這段程式碼可以方便的修改,而不是麻煩的修改。
假如你沒用settter,gettter.
案列1:系統要求所有對code:String設定值的時候需要記錄日誌。你原來的程式碼都是這個樣子的:
code = "SomeCode...";
你可能必須得在每處出現此語句的前面加上Log.in(code);有沒有想過如果那段程式碼不是你寫的,你沒有動那段程式碼的許可權,又或者程式碼已經通過jar包封成庫,釋出給客戶使用,你咋辦?
如果用setter,情形如下:
Java程式碼
- public void setCode(String code)
- {
- Log.in(code);
- this.code=code;
- }
同學五
封裝:任何類成員變數都不應該被外部直接訪問(且不說Javabean規範本身就是這樣)
同學六
使用 80% 的冗餘程式碼來解決 20% 不一定出現的問題