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

» JWorld@TW » Software Design » Effective Java  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:Millerlai]
tempo



版主

發文: 645
積分: 7
於 2004-02-01 01:07 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Millerlai wrote:
我想我的表達能力真的很差,Java的原始型態call by value當然沒什麼問題。

但是,對於物件型態而言,你所說的clone一份再傳進去,

是否考慮過該物件的本身資料量是很龐大的時候呢?

萬一一個ArrayList裡面裝的資料是很龐大的,難道也再複製一份嗎?

也可以把 ArrayList 做成 immutable..
討論到這裡就跟 final 沒關係了~~
怕傳入的物件內容被改變, 只有做 defensive copy 或是改成 immutable object..


reply to postreply to post
Welcome to: gamelet.com
and my blog: www.pocketshark.com/blog/page/tempo
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:Millerlai]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-02-01 02:59 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
Millerlai wrote:
對於 static method 應該會比較快
對於 non-static method 可能會比較慢

舉例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  public final static void hasFinal1(final Object obj) {
      Object c = obj;
  }
  public static void hasFinal2(final Object obj) {
    Object c = obj;
  }
  public static void noFinal(Object obj) {
    Object c = obj;
  }
  public final void c_hasFinal1(final Object obj) {
      Object c = obj;
    }
  public void c_hasFinal2(final Object obj) {
    Object c = obj;
  }
  public void c_noFinal(Object obj) {
    Object c = obj;
  }

效率上應該是
c_noFinal > c_hasFinal2 > c_hasFinal1 > hasFinal2 > hasFinal1 > noFinal

希望沒說錯才是..........=.=


這只是你的推測而已,能不能說明你的想法,為什麼 final formal parameter 能提升效能?

我想 formal parameter 宣告為 final 與否在效能上完全沒差別,因為編譯器對 actual argument 沒有得到任何額外的資訊(沒有因為 final 引進的性質而得到更多的資訊或得到 short-cut)也沒有辦法作任何臆測,所以產生出來的 bytecode 和 non-final formal parameter 時是一樣的(final/non-final formal parameter 是一樣的),至少目前 sun 的編譯器實做是如此,我想以後應該也是如此。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:metavige]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-02-01 03:07 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
metavige wrote:
的確是第一次看到這樣的做法呢~
果然要跟高手學習才快 ^_________________^

不過若為了 immutable 而將 argument 都設定成 final,這個考量如果是因為預防在 method 內部被修改,我不知道是不是效能也會提升??


沒有人說把 formal parameter 宣告為 final 是為了物件的 immutable 性質,formal parameter 和 object 的 member 無關,也就和 object 的 state 無關。只是有一派的人認為 formal parameter 不應該在 method scope 裡變動其值(指變數 storage 本身的內容,不是指 actual argument)才是好的設計方式。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:Duncan]
Millerlai





發文: 56
積分: 1
於 2004-02-01 18:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Duncan wrote:
這只是你的推測而已,能不能說明你的想法,為什麼 final formal parameter 能提升效能?

我想 formal parameter 宣告為 final 與否在效能上完全沒差別,因為編譯器對 actual argument 沒有得到任何額外的資訊(沒有因為 final 引進的性質而得到更多的資訊或得到 short-cut)也沒有辦法作任何臆測,所以產生出來的 bytecode 和 non-final formal parameter 時是一樣的(final/non-final formal parameter 是一樣的),至少目前 sun 的編譯器實做是如此,我想以後應該也是如此。

嗯...測試後的結果,如Duncan大大所說的沒錯.....

final/non-final formal parameter 能看做一樣的幾乎感覺不出來,

我果然猜錯了.....XD

每個method呼叫20億次....測試的結果如下....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
=================
Windows 2000 
CPU: P 4 - 2G  
RAM:768MB
=================
java version "1.4.1_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_05-b01)
Java HotSpot(TM) Client VM (build 1.4.1_05-b01, mixed mode)
=================
C:\Documents and Settings\Administrator\桌面新資料夾 (2)>javac Measure.java
hasFinal1:64203ms  hasFinal2:64765ms  noFinal:64891ms  c_hasFinal1:67297ms  c_hasFinal2:67234ms  c_noFinal:67235ms
hasFinal1:64921ms  hasFinal2:64922ms  noFinal:64938ms  c_hasFinal1:67281ms  c_hasFinal2:67250ms  c_noFinal:67266ms
hasFinal1:64890ms  hasFinal2:64891ms  noFinal:64875ms  c_hasFinal1:67234ms  c_hasFinal2:67266ms  c_noFinal:67328ms
hasFinal1:64906ms  hasFinal2:64907ms  noFinal:64859ms  c_hasFinal1:67219ms  c_hasFinal2:67156ms  c_noFinal:67187ms
hasFinal1:64813ms  hasFinal2:64875ms  noFinal:64875ms  c_hasFinal1:67188ms  c_hasFinal2:67203ms  c_noFinal:67234ms
hasFinal1:64828ms  hasFinal2:64813ms  noFinal:64797ms  c_hasFinal1:67172ms  c_hasFinal2:67156ms  c_noFinal:67219ms
hasFinal1:64875ms  hasFinal2:64828ms  noFinal:64875ms  c_hasFinal1:67187ms  c_hasFinal2:67156ms  c_noFinal:67157ms
hasFinal1:64812ms  hasFinal2:64813ms  noFinal:64875ms  c_hasFinal1:67203ms  c_hasFinal2:67172ms  c_noFinal:67234ms
hasFinal1:64813ms  hasFinal2:64875ms  noFinal:64828ms  c_hasFinal1:67156ms  c_hasFinal2:67219ms  c_noFinal:67109ms
hasFinal1:64813ms  hasFinal2:64796ms  noFinal:64813ms  c_hasFinal1:67141ms  c_hasFinal2:67171ms  c_noFinal:67157ms
==================平均時間=========================
hasFinal1:      64787 ms
hasFinal2:      64848 ms
noFinal:         64862 ms
c_hasFinal1:   67207 ms
c_hasFinal2:   67198 ms
c_noFinal:      67212 ms


另外,想請問Duncan您都怎樣研究JVM實作?我滿好奇的....^^


Millerlai edited on 2004-02-01 18:47
reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:Duncan]
metavige

麥塔.米奇

版主

發文: 2133
積分: 10
於 2004-02-02 01:04 user profilesend a private message to usersend email to metavigereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Duncan wrote:
沒有人說把 formal parameter 宣告為 final 是為了物件的 immutable 性質,formal parameter 和 object 的 member 無關,也就和 object 的 state 無關。只是有一派的人認為 formal parameter 不應該在 method scope 裡變動其值(指變數 storage 本身的內容,不是指 actual argument)才是好的設計方式。


原來如此,是我誤會了


reply to postreply to post
請各位新手參考 論壇規範Java 新手 FAQ
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:Duncan]
saijone

Web Services

版主

發文: 470
積分: 24
於 2004-02-02 06:35 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Duncan wrote:
沒有人說把 formal parameter 宣告為 final 是為了物件的 immutable 性質,formal parameter 和 object 的 member 無關,也就和 object 的 state 無關。只是有一派的人認為 formal parameter 不應該在 method scope 裡變動其值(指變數 storage 本身的內容,不是指 actual argument)才是好的設計方式。

在 CORBA 的 IDL, 以及 WebServices 的 WSDL (rpc style) 裡頭
均支援 "INOUT" 及 "OUT" Parameter Mode
也就是一個 method/operation 可以有多個 output
input parameter 也可同時作為 output
在JAVA上, 如此的 parameter 對應到一種叫做 "Holder" 的 JAVA Class
每一個 Holder 都有一個叫做 "value" 的 public field 來讓 method/operation 改它
http://java.sun.com/j2se/1.4.2/docs/api/org/omg/CORBA/package-summary.html
http://java.sun.com/j2ee/1.4/docs/api/javax/xml/rpc/holders/package-summary.html


reply to postreply to post
You don't need a reason to help people
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:saijone]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-02-02 10:32 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
saijone wrote:
在 CORBA 的 IDL, 以及 WebServices 的 WSDL (rpc style) 裡頭
均支援 "INOUT" 及 "OUT" Parameter Mode
也就是一個 method/operation 可以有多個 output
input parameter 也可同時作為 output
在JAVA上, 如此的 parameter 對應到一種叫做 "Holder" 的 JAVA Class
每一個 Holder 都有一個叫做 "value" 的 public field 來讓 method/operation 改它
http://java.sun.com/j2se/1.4.2/docs/api/org/omg/CORBA/package-summary.html
http://java.sun.com/j2ee/1.4/docs/api/javax/xml/rpc/holders/package-summary.html


這依然與 method 所屬的 object 與當作 actual argument 的 object 之 immutable 性質無關。formal parameter 宣告為 final 在語意上是指 formal parameter 所使用的 storage 具有不可變更性,如同您上一篇發文提及,你"依然"可以改變 actual argument object 的狀態(內容),也就是說:宣告為 final SomeTypeHolder 的 formal parameter 是可以透過 value field 來改變 actual argument object(藉以達到它種語言 pass by reference 的效果),除非 Holder 的 value field 是 final 性質,但這和此 thread 所討論的並不是同一件事。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:TAHO]
moon_light





發文: 17
積分: 0
於 2005-07-04 01:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
TAHO wrote:
我不太理解你想表達啥說∼∼

這可以做一些責任劃分吧

對呼叫 method 者來說
如果怕自己傳進去的東西會變,又不能確定 method 會不會改到,就先 clone 一份再傳入啊
對寫作 method 者來說
如果沒必要改傳入的物件,就別改啊,幹嘛有事沒事去改傳入的東西?



其實是避免手誤

1
2
3
4
5
6
7
8
9
class Friend {
   private String name;
   //宣告大堆變數...
   
   public setName(String name){
        //一大堆的vaildation code..
        name = name; //!糟糕!
   }
}


有些時候在寫setter and getter的時候為了讓引數的目的一目了然會取和目標field 一樣的名字(而且要想個有意義的名字也不是易事), 但有時候一時手誤忘了加this(如果是call by value情形會更為糟糕, 整個method有白做的可能). 而可能造成的bug卻不是那麼易找出來. 如果此時作為parameter的name有加上final complier/IDE會馬上警告.
關於final和immutable Oreilly的Hardcore Java有更詳盡的解釋


reply to postreply to post
go to first page go to previous page  1   2  go to next page go to last page
» JWorld@TW »  Software Design » Effective Java

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

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8