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
を実装するクラスの可変メンバーをクローンすることができますか?
ありがとうございました。
ありがとう。 'mySB'が' SBContainer'の 'final'であるとします。それをどのように複製するのですか?もちろん、ここでクローニングすることは意味がありません。しかし、私は同期の目的のために最終的なオブジェクト 'ロック 'を持っていると言う。クローンできない場合、object1の 'lock'が取得されると、object2のロックは同じオブジェクトであるため取得されます。 – bdhar
一般に、 'clone'と' final'は互換性がありません。 'final'修飾子を削除することもできますが、' new SBContainer(new StringBuffer(this.mySB)) 'を呼び出すことで手動でクローンを作成することをお勧めします。 –
また、一緒にクローンを作成したり、独自のコピー方法を作成したりしない方がよいでしょう。クローニングはほんの少しの疣贅です。 –