JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區 » Object/物件導向  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
作者 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ [Re:timestone]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2011-10-16 02:12 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
timestone wrote:
各位好,小弟初學java,現在正在努力體會面向對象編程的精神。但是在參照別人的程序后,自己寫一些當做練習的程序的時候,發現把一個類封裝的很好看起來是很沒有必要的。可能是我還不理解封裝特性的好處,請各位指教。

比如一件簡單的類:
1
2
3
4
5
class A
{
     int number;
     String name;
}


如果安裝封裝的要求,就要限制訪問權限,寫上setter和getter方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A2
{
     private int number;
     private String name;
 
     public void setNumber(int number)
     {
          this.number=number;
     }
     public void setName(String name)
     {
          this.name=name;
     }
 
     public int getNumber()
     {
          return number;
     }
     public String getName()
     {
          return name;
     }
}

這樣用private把屬性封裝起來,最後還是要用public的方法把他們間接暴露出來用,不是很麻煩嗎?再說了,這是基本屬性,最簡單的使用,如果類的屬性里包含一些複雜的,自定義的類型,情況就更是一團糟了。所以我覺得寫setter和getter是一件費力不討好的事。

與其這樣,還不如直接把屬性暴露出來用:
1
2
3
4
5
class A3
{
     public int number;
     public String name;
}

可能是水平有限,我實在是看不出他們在應用中的不同,但是在參考別人的程序時,甚至是java的api文檔時,發現大家的java程序都是這麼寫的。。。所以有此一問,請各位不吝賜教~


會不會覺得 class A2 的 getter/setter 是多此一舉的做法,與你看這個 class 的方向有關。
若你的看法是 class A2 有兩個不相干的狀態或是欄位:number 與 name,它所提供的就是兩個空間,那麼當然就會覺得 getNumber/setNumber/getName/setName 是多此一舉,不如就不要隱藏這兩個欄位。但如果你是看成每個 A2 object 都有兩個屬性(property)可以讓你去設定其值與取得其值:setNumber/setName/getNumber/getName(重點在於提供這些功能性),而 private int number 與 private String name 二 field 只是實作保存(至少在 object 還活著時)這兩個 property 的方式之一(最簡單地保存在記憶體裡),那麼是不是就不會覺得這樣作很多餘?

物件導向設計時重視的是物件的行為(可使用的操作),對使用物件者來說,怎麼實作出這些操作、怎麼維持它的狀態與外皮之下長甚麼樣子是不重要的(也不應該是重要),重要的是它提供哪些我用的上的操作與如何操作,實作物件時去封裝皮內的血肉結構與運作方式這些細節,可減少使用端對物件的實作細節的依賴(所謂的偶合性),降低實作細節的變更對使用端的影響。

如果你要把 class A 當作純粹是一種數據的容器(不提供任何操作或是說放數據進去與取出不是他要提供的功能),寫成 A3 沒什麼不對,但說起來這樣子就不算是物件導向的做法;如果你是把 A 當作一種可以保存與取回數據的功能性物件,那麼 A2 是多種合理的實作之一。


Duncan edited on 2011-10-16 03:00
reply to postreply to post

給我
辣味豆腐 其餘免談
話題樹型展開
人氣 標題 作者 字數 發文時間
4017 其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ timestone 963 2011-10-15 10:55
3961 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ qwsopp 93 2011-10-15 16:56
3829 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ Duncan 1760 2011-10-16 02:12
3763 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ Ponylin 1402 2011-10-16 09:18
3930 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ timestone 246 2011-10-16 10:01
3756 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ ddtet 582 2011-10-17 09:24
3851 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ jimwayne 369 2011-10-17 11:45
3710 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ caterpillar 368 2011-10-17 11:50
3798 Re:其實“封裝”特性到底有什麽好處?對比“private+setter+getter”和“public+直接使用”兩種方法~ timestone 229 2011-10-17 21:30
» JWorld@TW »  Java 新手區 » Object/物件導向

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8