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
本主題所含的標籤
無標籤
作者 [Effective Java] 條款13 : 偏愛不變性 (immutability)
metavige

麥塔.米奇

版主

發文: 2133
積分: 10
於 2004-01-30 00:10 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
何謂 immutable class(不可變類別)?
就是其實體不能修改的 class, 包含在這種 class 內的所有資訊都是在創建之初提供, 並在物件生存期間固定不變。
例如 String, 基本外覆類別(primitive wrapper classes)等, 這種 classes 比起 mutable classes 來說, 更容易設計、實現和使用, 不易犯錯而且更安全。

在建立 immutable class 時, 請遵守下列原則:
1. 不要提供任何 「可修改物件內容」的函式
2. 保證沒有任何函式被覆寫
3. 令所有欄位為 final
4. 令所有欄位都是 private
5. 保證對任何可變組件的互斥存取

剛剛開始的時候, 我是對 String 這個 class 是屬於 immutable class 有點懷疑, 畢竟小弟並沒有接受過 SCJP 的洗禮, 有些基本的東西並不了解
但是後來才知道像是一個簡單的 "A"+"B" 這個動作, 原來是去產生了一個新的物件, 來置放 "AB" 這個新的 String

immutable objects 基本上是多緒安全的, 不需同步機制的輔助, 因為就算是多個執行緒同時去存取某個 immutable class, 也不會破壞該物件

immutable objects 可被自由共享, 這使得我們永遠不必對他使用保護性拷貝(條款24)

immutable objects 對其他物件來說, 形成了大量構件

immutable objects 唯一的缺點就是, 每一個不同的值都必須需要一個獨立的物件

如果你執行一個多步操作, 就好像我之前提過的

1
String newString = "A" + "B";

每一步產生一個新物件, 但最後只需要保持最後的結果, 那這樣效率問題就會凸顯出來了

如果你可以預測這些多步操作的步驟, 則最好是提供一個 public mutable companion class, 就好像是 StringBuffer v.s. String


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



版主

發文: 645
積分: 7
於 2004-01-30 00:34 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
有人寫 code 的時候會大量使用 final (C# 裡用 readonly) 嗎?
我不知道是從 cocoon 還是哪裡學到這個習慣, 然後一直使用到今..
現在讀到別人的 code 遇到 immutable member 也會很想把他加上 final..

不過, 整個 team 好像只有我會這樣..
有點想要推廣給整個 team follow, 但是, 我也很少在別人 code 上看到有人這樣做..Confused

有人寫 code 也會這樣嗎?


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





發文: 277
積分: 4
於 2004-01-30 01:00 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
看過人討論這個問題, 有些人的意見是覺得為什麼不把資料直接存成文字檔案算了, 有些人是覺得這種做法可顧慮到資料安全性, 給它鎖在 class 檔裡面, 可也有人提到 performance 的問題~ 多一個 object instance 總是...忘了最後的結論是什麼(年紀大了忘性較佳), 見仁見智吧, 好像降作的人還不少的哩~

reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:tempo]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-30 01:13 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
用 final 應該是好習慣∼∼
我想對於閱讀程式應該會有幫助
最好把 method 的 parameter 也都改成 final ∼∼


reply to postreply to post
請養成良好的 Java 程式碼慣例 習慣
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:TAHO]
tempo



版主

發文: 645
積分: 7
於 2004-01-30 01:22 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:
用 final 應該是好習慣∼∼
我想對於閱讀程式應該會有幫助
最好把 method 的 parameter 也都改成 final ∼∼

yes, 我已經極端到這樣了..Tongue


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

戀香

版主

發文: 3570
積分: 1
於 2004-01-30 05:18 user profilesend a private message to usersend email to browserreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
tempo wrote:
yes, 我已經極端到這樣了..Tongue


Tempo 你可以 post 一下你極端的 code
我想看看你極端到什麼程度 ... Wink


reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:TAHO]
Yoshi

塵世中一個迷途小書僮

版主

發文: 874
積分: 22
於 2004-01-30 09:28 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:
用 final 應該是好習慣∼∼
我想對於閱讀程式應該會有幫助
最好把 method 的 parameter 也都改成 final ∼∼


我也有這個習慣,只要我覺得是常數的東西都會加上final
不過我想tempo的極端可能是只要覺得method不會被繼承都會加上final了
我記得好久以前看過他po過一些code


reply to postreply to post
YOSHI!
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:TAHO]
anthonychen

外線交給我

版主

發文: 2033
積分: 8
於 2004-01-30 10:33 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:
用 final 應該是好習慣∼∼
我想對於閱讀程式應該會有幫助
最好把 method 的 parameter 也都改成 final ∼∼

我還沒有這麼極端Tongue
不過習慣把類別中的常數加上private final 倒是真的。Cool


reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:browser]
tempo



版主

發文: 645
積分: 7
於 2004-01-30 12:13 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
browser wrote:
Tempo 你可以 post 一下你極端的 code
我想看看你極端到什麼程度 ... ;)

極端是指把 method 的 parameter 也都加上 final ...
雖然這個幾乎沒有用..:S

我 po 個我會怎麼寫好了..
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
28
29
30
31
public final class ByteBufferOutputStreamAdaptor extends OutputStream
{
    private final ByteBuffer buffer;
 
    public ByteBufferOutputStreamAdaptor(final ByteBuffer buffer)
    {
        assert(buffer != null);
        this.buffer = buffer;
    }
 
    public void write(final int b) throws IOException
    {
        this.buffer.put((byte) b);
    }
 
    public void write(final byte[] b, final int off, final int len) throws IOException
    {
        assert(b != null);
        assert(off >= 0);
        assert(len >= 0);
        assert(off + len <= this.buffer.capacity());
 
        this.buffer.put(b, off, len);
    }
 
    public void write(final byte[] b) throws IOException
    {
        assert(b != null);
        this.buffer.put(b);
    }
}


看大家的回覆都有用 final ...
可是好像不管是看 open source projects 或是我認識的人都沒有這樣的習慣..


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

塵世中一個迷途小書僮

版主

發文: 874
積分: 22
於 2004-01-30 12:17 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
tempo wrote:
極端是指把 method 的 parameter 也都加上 final ...
雖然這個幾乎沒有用..:S


這種放在stack裡的變數宣告成final幹嘛啊...?
還真的夠極端喔....Big Smile


reply to postreply to post
YOSHI!
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:tempo]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-01-30 13:00 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
tempo wrote:
極端是指把 method 的 parameter 也都加上 final ...
雖然這個幾乎沒有用..:S

看大家的回覆都有用 final ...
可是好像不管是看 open source projects 或是我認識的人都沒有這樣的習慣..


我有看過外國人寫的套件是有這樣的習慣。formal parameter 的 final 特性不算是 signature 的一部份,作用效力只有針對你而已。


reply to postreply to post

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



版主

發文: 645
積分: 7
於 2004-01-30 13:25 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
Yoshi wrote:
這種放在stack裡的變數宣告成final幹嘛啊...?
還真的夠極端喔....Big Smile


喔?
其實我覺得 stack 變數也有 final 的必要, 因為當 method 長度變長, 有可能不小心變數就會被重設或設錯..
另外, stack 變數設為 final 也會讓人養成為變數取合適名稱的好習慣..


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

外線交給我

版主

發文: 2033
積分: 8
於 2004-01-30 13:34 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
tempo wrote:
喔?
其實我覺得 stack 變數也有 final 的必要, 因為當 method 長度變長, 有可能不小心變數就會被重設或設錯..
另外, stack 變數設為 final 也會讓人養成為變數取合適名稱的好習慣..

method 變數加 final 的寫法第一次看過,不過聽來似乎不錯。Cool
如果可以防止變數在mrthod中被更改的機會,那我以後也要這樣寫~~Blush


reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:metavige]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-30 14:04 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
不知道有沒有人極端成這樣:

把所有的 class , class member ( field, method), method parameter, local variable
全都先宣告為 final

等到真的有需要更動或繼承,再一個一個拿掉∼∼

=======================================

宣告為 final 應該可以由三方面來思考∼∼
1. 以程式結構來說,該宣告 final 就應該宣告,這個逃不掉的
但是大多時候有宣告跟沒宣告並不會有太大影響
( 不會有事沒事就有人跑來繼承,然後改寫不該改的 )
2. 以效率來說,目前 Sun 的編譯器,似乎對這方面著墨很少,宣告了也不會比較快
3. 以程式碼可讀性上來說,宣告 final 可以讓人家容易閱讀,也可以讓你避免不小心改到不該改的東西
比如說把 method parameter 的變數指向別的物件,結果 method 後半段都在處理別的物件
而不是傳進來的那個物件,萬一出問題可能就很難 debug
這個 refactoring 那本書有說∼∼


reply to postreply to post
請養成良好的 Java 程式碼慣例 習慣
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:metavige]
popcorny

Jakarta 2%

版主

發文: 752
積分: 20
於 2004-01-30 15:05 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
我雖然沒有把param設final
不過我都保持param為符合final的原則..
也就是primitive type的不改變內涵值
reference type的不重指向另一個reference
當然最好的是設上final啦
但是感覺好像真的有點瑣碎說Disapproved


reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:Duncan]
metavige

麥塔.米奇

版主

發文: 2133
積分: 10
於 2004-01-30 23:28 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
的確是第一次看到這樣的做法呢~
果然要跟高手學習才快 ^_________________^

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


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





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

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

對於 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

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


reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:metavige]
saijone

Web Services

版主

發文: 470
積分: 24
於 2004-01-31 09: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
metavige wrote:
...
不過若為了 immutable 而將 argument 都設定成 final,這個考量如果是因為預防在 method 內部被修改,我不知道是不是效能也會提升??

Millerlai wrote:
...
效率上應該是
c_noFinal > c_hasFinal2 > c_hasFinal1 > hasFinal2 > hasFinal1 > noFinal

不知道有哪樣的應用程式需要把這樣的效能計較進去?
效能應該不是要不要 final 的主要考量


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

Web Services

版主

發文: 470
積分: 24
於 2004-01-31 09:41 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
anthonychen wrote:
method 變數加 final 的寫法第一次看過,不過聽來似乎不錯。Cool
如果可以防止變數在mrthod中被更改的機會,那我以後也要這樣寫~~Blush

只要這變數不是immutable, 它的'內容'還是可以被改 ...
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
28
class T {
    public static void foo(final byte[] b) {
        b[0] = 0;
 
        new Thread( new Runnable() {
            public void run() {
                while(b[0] == 0) {
                    System.out.println("b[0]: " + b[0]);
                    System.out.println("b[1]: " + b[1]++);
                }
            }
        }).
        start();
 
        new Thread( new Runnable() {
            public void run() {
                b[0] = 1;
            }
        }).
        start();
    }
    public static void main(String[] args) {
        final byte[] b = {2,1};
        foo( b );
        System.out.println("----b[0]: " + b[0]);
        System.out.println("----b[1]: " + b[1]);
    }
}


saijone edited on 2004-01-31 10:14
reply to postreply to post
You don't need a reason to help people
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:metavige]
ingramchen

Web monkey



發文: 479
積分: 12
於 2004-01-31 12:27 user profilesend a private message to usersend email to ingramchenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
咦?為什麼需要將 method 的 parameter 設成 final ?

在設計上 method 所傳入的訊息是屬於 class 外部的資訊,該 class 沒有
理由去更動 parameter 啊? 如果需要更動,那不是表示這個 parameter 屬
於這個 class 的一部份,該做的應該是 refactor 成 class 的 field 不是嗎?

將 parameter 設成 final 多只有在 inner class 才看的到。


reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:ingramchen]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-31 13:46 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
ingramchen wrote:
咦?為什麼需要將 method 的 parameter 設成 final ?

在設計上 method 所傳入的訊息是屬於 class 外部的資訊,該 class 沒有
理由去更動 parameter 啊? 如果需要更動,那不是表示這個 parameter 屬
於這個 class 的一部份,該做的應該是 refactor 成 class 的 field 不是嗎?

將 parameter 設成 final 多只有在 inner class 才看的到。


設定 final 並不是不想改『物件』內容,而是『避免不小心』改到『變數』內容

1
2
3
4
5
6
7
void method(Object obj){
  Object obj2 = obj; // 希望能強迫使用這個
  obj = new Object(); // 避免出現類似這種語法
            // 因為一改動以後,這個 obj 已經不是外面傳入的物件
            // 後半段程式就很容易搞混
  .....                                      
}


reply to postreply to post
請養成良好的 Java 程式碼慣例 習慣
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:ingramchen]
Millerlai





發文: 56
積分: 1
於 2004-01-31 14:16 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
ingramchen wrote:
咦?為什麼需要將 method 的 parameter 設成 final ?

在設計上 method 所傳入的訊息是屬於 class 外部的資訊,該 class 沒有
理由去更動 parameter 啊? 如果需要更動,那不是表示這個 parameter 屬
於這個 class 的一部份,該做的應該是 refactor 成 class 的 field 不是嗎?

將 parameter 設成 final 多只有在 inner class 才看的到。

我同意你的看法,重構的書裡面是有提到這個觀點。

對於原始型態的參數不會有這樣的問題,在java都是call by value的,

如果用像這樣 :
1
2
3
4
5
6
7
 
public void test1(final int size){
     
      //假如此處時很長的時候,這裡的語意上可以當作是
      //將size當作這裡面的local的『常數』
     
}


1
2
3
4
5
6
 
public void test1(int size){
     
     //不過它即使不小心被改到了,也不會影響外部傳進來的參數原本的值
     
}


但是有一個問題在於『保護外部』所傳進來物件的『內容值』,避免實作method的人『不小心更動』到外部傳進來的物件之『內容值』。

實作上在C++裡面,因為有call by const-reference的輔助所以可以保護外部傳進來的物件『內容值』不被更動。

以C++觀點來看,例如:
1
2
3
4
5
6
   void test2(const int& a){ //:此處這樣寫其實在C++意義不大
          //實作時已經可以保護外部所傳進來的參數
   } 
   void test3(const Objects& b){
          //實作時已經可以保護外部所傳進來的參數
   }

但是對於Java的final是指在reference上作lock,這對於在實作此method時保護外部傳遞的參數的物件『內容值』而言沒有什麼意義。

今天在C++在『.h』宣告的method時,我就能夠利用call by const保證實作的人不會動到外部所傳進來的物件內容。

但是今天在Java上面的interface中或abstract class宣告一個method
你無法保證實作的類別不會改到ArrayList的內容值?
難道要在interface裡面宣告一個欄位嗎?這個介面若要用在Multithreading
這就有待評估了,若又牽涉到synchronized的問題,可能會更加複雜吧?(有點離題了....)
1
2
3
4
5
interface XXX{
     public void test4(final ArrayList list);
     public void test5(ArrayList list);
 
}

or
1
2
3
4
abstract class XXX{
     public abstract void test4(final ArrayList list);
     public abstract void test5(ArrayList list);
}


至於final是不是『效率』上的考量,我倒覺得看需求再說,或許『最後的最佳化』會用到....當然這是我唬扯的!

各位看看就好.....=.=


Millerlai edited on 2004-01-31 14:23
reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:Millerlai]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-31 15:00 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
我不太理解你想表達啥說∼∼

這可以做一些責任劃分吧

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

可以麻煩你舉個例子,說明一下 Java 的 call by value 會造成什麼實作上的困難嗎?


reply to postreply to post
請養成良好的 Java 程式碼慣例 習慣
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:TAHO]
Millerlai





發文: 56
積分: 1
於 2004-01-31 16:02 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 者來說
如果沒必要改傳入的物件,就別改啊,幹嘛有事沒事去改傳入的東西?

可以麻煩你舉個例子,說明一下 Java 的 call by value 會造成什麼實作上的困難嗎?

我想我的表達能力真的很差,Java的原始型態call by value當然沒什麼問題。

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

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

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

『如果沒必要改傳入的物件,就別改啊,幹嘛有事沒事去改傳入的東西?』

這是指實作的人清楚的知道,但不保證一定不會發生,

我是說『萬一是疏失上的錯誤』造成的呢?

寫程式的人當然都知道該怎麼作,但無心之過總是有的,

但這個無心之過卻無法在編譯期找到,只有在執行期發生問題了才知道。

這個問題只能留在執行期測試的時候,才有辦法找到。

只能說這是『潛在性的危機』,不一定會發生這樣的情況。

當然這是我的看法,如果真的不會有這個問題,那大概是我多慮了吧...XD


reply to postreply to post
作者 Re:[Effective Java] 條款13 : 偏愛不變性 (immutability) [Re:TAHO]
ingramchen

Web monkey



發文: 479
積分: 12
於 2004-01-31 20:37 user profilesend a private message to usersend email to ingramchenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
了解了解,要防呆就是了,防止自己或 subclass 無意中改到。
嗯,這是個好習慣。不過應該不算是 class immutability 的必要條件。


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