1. 程式人生 > >關於面向物件程式設計中很多人用get()和set()方法,而不用public的一點總結

關於面向物件程式設計中很多人用get()和set()方法,而不用public的一點總結

在很多程式中,都喜歡定義一個privata變數,然後為這個私有變數加上get(),set()方法。那為什麼不直接定義一個public變數呢?這樣做到底有什麼好處和意義呢?難道真的僅僅只是為了程式碼規範?別逗了,不管你信不信,反正我是不信!帶著這個問題我在網上尋找答案,真是眾說紛紜啊,每個人都能說出一點點道理,但是卻都不足以說服我!(所以在這裡做一些總結,和大家分享,我們共同學習,共同進步。如果有什麼想法和意見,也歡迎大家提出來,我們一起交流。)其中看到有這樣一種說法:

“get()和set()方法起到對外界封閉的作用,舉個例子:假如你的褲兜裡有很多錢,你肯定不會讓別人都來掏,肯定只有自己能拿到,或者你拿出來給他,set和get就相當與你的手  而你類裡的變數就相當與你兜裡的錢,對於外面的人來說不知道你類裡有什麼他就知道呼叫這個get會給他一個什麼東西”

  哇!貌似回答得很專業,很形象,很生動,很有道理啊,差一點我就要膜拜了,但是就在千鈞一髮的時刻,我冷靜了下來。TNN的,差點就被你給忽悠了,這個舉例完全沒有回答實質性的問題嘛,會舉例子的人傷不起啊~~~~(>_<)~~~~ 。如果一定要把get()和set()比喻成手的話,也不能比喻成你自己的手,因為get()和set()方法也是public屬性的,誰都可以呼叫,也就是說任何人的手都還是可以拿到你的錢,那和直接把變數設成public有什麼區別嗎?至於對外面的人來說知不知道你類裡有什麼,這個只是變數命名規範問題而已,和屬性不存在半毛錢關係吧?想讓人看見和更改的變數就設成public,不想讓人看見和更改的就設成privtata,已經很天衣無縫了,為什麼還要get(),set()方法呢?


  我又迷茫了,帶著依依不捨的心情,我離開了這位大神,繼續尋找答案。其實每個人都知道get()和set()方法肯定是有好處的,但是有什麼好處呢卻又說不清楚,只能乖乖照做了(但是沒有糖吃 哈哈!),而且工具可以幫你自動生成get()和set()方法,一點都不麻煩。但是不能因為不麻煩就傻傻的去做,而不去考慮為什麼要這麼做,那我們也淪落為了工具!⊙﹏⊙b汗!又偏題了,繼續研究。。。

其實大多數人講的是這關係到安全性的問題,貌似有點道理,但是卻好象沒什麼依據,請問我使用public變數有什麼不安全?   使用get(),set()安全在哪裡?
有些人說封裝性,但是變數本身就是封裝在類裡面的啊!

其實大部分人都是人云亦云,說什麼安全性,封裝性,只要學java的人都會說,沒有一本java的書不提及這些名詞,   其實真正理解的人不多。

我只知道用get()和set()有一個好處,當輸入.get(.set)   時就能顯示所有的屬性。把所有設定都歸納起來,對於外部的使用都方便而已。假如你開發一個類給別人用,人家只要輸入.get就能知道所有的屬性。(天啊!就只有這麼一丟丟的好處?我都不好意思跟別人說!)  

  難道get()和set()真的只是一種規範做法而已,完全等效於public變數?

  不!我這種人是絕對不甘心找不到答案就把問題歸結於程式碼規範的!

  那我想現在唯一可以讓我信服的答案暫時就是:用get()與set()可以控制變數。

如果get()和set()方法裡面只放一個賦值語句的話,和public變數應該沒什麼區別。 
  但是設想,如果你的變數score代表的是一個學生的數學成績,理論上,分數只可能是0-100的整數,如果你把將score設為public,不用get()和set(),那麼使用者很可能會輸入1-100以外的數字,如果你把將score設為privata,再用setScore()來設定分數,你就完全可以控制這種行為了。

   哈哈 其實幾句話可以把這個問題搞定,但是為了把文章寫得生動一點,廢話多了一點點,請大家見諒!如果大家還知道get()和set()有什麼其他的好處的話,指教小弟一下,感激不盡!


————感謝各位牛人的指點,以下整理自各位的回覆和點評,持續更新——————
使用get()和set()而不使用public的成員變數,是因為我們設計類的時候要遵循這樣的原則:
提供類的人要儘量將類中有什麼隱藏起來,只告訴使用者你能做什麼
使用類的人不關心你的類中有什麼,只關心類提供了什麼功能
所以設計類的時候要儘量不提供public的成員變數,最好一個都沒有,只提供介面
這條原則其實不僅是程式碼規範的問題,放到工作中,這就是多專案組或多部門之間合作的準則
這條原則也絕對不是某個獨自編碼的程式狼一拍腦袋就想出來,這是經歷過有組織開發過工作的程式猿才能設計出來的。
————————————————————————————————————————————————————————————
這個問題其實很簡單,比如
setAge(int age){
if(age<1||age>120)
  throw new Exception(" 你輸入的年齡不合法");
}else{
  this.age=age;
}

這個是public變數做不到的,安全是其中一個原因,另外樓主你要是學過Hiberante和Spring的話,就會知道
一些類的變數,即使是public的,也必須寫上set方法,否則就出錯,框架設計的時候就這麼要求的

所以別人都這麼做的時候,你這麼做只會有好處而不會有壞處,這就是標準