1. 程式人生 > >JavaBean的get、set方法引發的討論

JavaBean的get、set方法引發的討論

   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方法的引數必須和生命的變數是一樣的,比如上面需要是下面:
public  void setOutput(List<OscKepler> t){
   this.out= t;
}
關於get,set方法的意義參考以下貼子:

轉自http://kennethf6986.iteye.com/blog/828179  

一日,一個兄弟發了一個被大家廣泛認為蛋疼的帖子,如下: 

Java程式碼  收藏程式碼
  1. {       
  2.     private String code;   //設定成私有變數,有什麼鳥用? 難道是為了整個團隊配合的時候告訴那些人這個變數不可以動嗎? 那是不是一個開發一個專案的時候 這些 修飾符 是毫無意義的?     
  3.     public void setCode(String code){       
  4.        this.code=code;       
  5.     }      
  6. }  


為什麼要寫一個方法去給變數賦值? 
不能直接吧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程式碼  收藏程式碼
  1. public void setCode(String code)     
  2. {     
  3.     Log.in(code);     
  4.     this.code=code;         
  5. }     


同學五
封裝:任何類成員變數都不應該被外部直接訪問(且不說Javabean規範本身就是這樣) 

同學六

使用 80% 的冗餘程式碼來解決 20% 不一定出現的問題