2011-06-22 11 views
2

私はクラスSBContainerで、StringBufferのメンバーmySBを持っています。私はこのようなSBContainerためCloneableを実装しています -変更可能なメンバーのクローニング

SBContainer implements Cloneable { 
    public StringBuffer mySB; 
    public SBContainer() { 
     mySB = new StringBuffer("This is a test string"); 
    } 
    public Object clone() throws CloneNotSupportedException { 
     SBContainer cloned = (SBContainer)super.clone(); 
     return cloned; 
    } 
} 

、私はMyContainerのオブジェクトsbc1を作成し、それがクローンsbc2です。コンテナmySBはクローンされていないようです。 sbc1.mySBおよびsbc2.mySBは、同じStringBufferオブジェクトを指しています。私は、次のクラスを使用してテスト -

public class SBContainerTest { 
    public static void main(String[] args) { 
     SBContainer sbc1 = new SBContainer(); 
     SBContainer sbc2 = null; 
     try { 
      sbc2 = (SBContainer)sbc1.clone(); 
     } catch(CloneNotSupportedException e) { 
      e.printStackTrace(); 
     } 
     sbc1.mySB.append(" ...something appended"); 
     System.out.println(sbc2.mySB); 
    } 
} 

EDIT: た出力:This is a test string ...something appended

だから、私はこのようなmySBクローンしようとした -

cloned.mySB = (StringBuffer)mySB.clone(); 

を...と私このエラーが発生する -

SBContainerTest.java:8: clone() has protected access in java.lang.Object 
     cloned.mySB = (StringBuffer)mySB.clone(); 
             ^
1 error 

これはどうすれば実現できますか?どのようにしてCloneableを実装するクラスの可変メンバーをクローンすることができますか?

ありがとうございました。

答えて

2

StringBufferCloneableではないため、手動でクローンする必要があります。私はあなたのclone方法でこれを提案します:

public Object clone() throws CloneNotSupportedException { 
    SBContainer cloned = (SBContainer)super.clone(); 
    cloned.mySB = new StringBuffer(this.mySB); 
    return cloned; 
} 
+0

ありがとう。 'mySB'が' SBContainer'の 'final'であるとします。それをどのように複製するのですか?もちろん、ここでクローニングすることは意味がありません。しかし、私は同期の目的のために最終的なオブジェクト 'ロック 'を持っていると言う。クローンできない場合、object1の 'lock'が取得されると、object2のロックは同じオブジェクトであるため取得されます。 – bdhar

+0

一般に、 'clone'と' final'は互換性がありません。 'final'修飾子を削除することもできますが、' new SBContainer(new StringBuffer(this.mySB)) 'を呼び出すことで手動でクローンを作成することをお勧めします。 –

+0

また、一緒にクローンを作成したり、独自のコピー方法を作成したりしない方がよいでしょう。クローニングはほんの少しの疣贅です。 –

関連する問題