私は、はるかに大きく、かさばるクラスのスケルトンを保持するシンプルなクラスを持っています。このスケルトンはすべて、文字列ID、型の列挙、およびオプションのフラグです。クラスの列挙型をクローンに渡すことは安全ですか?
このスケルトンをクローンすることができますが、列挙がクローンセーフ(値渡し)であるかどうかわかりません。私は彼らがクラスのように扱われているからではないと思う(参照渡し)。列挙をクローンに渡すだけで安全ですか?
明確にするために例:
私は、はるかに大きく、かさばるクラスのスケルトンを保持するシンプルなクラスを持っています。このスケルトンはすべて、文字列ID、型の列挙、およびオプションのフラグです。クラスの列挙型をクローンに渡すことは安全ですか?
このスケルトンをクローンすることができますが、列挙がクローンセーフ(値渡し)であるかどうかわかりません。私は彼らがクラスのように扱われているからではないと思う(参照渡し)。列挙をクローンに渡すだけで安全ですか?
明確にするために例:
class A {
String id;
Enum state;
int flags;
A clone() {
A ret = new A();
ret.id = id;
ret.state = state; // Am I safe here?
ret.flags = flags;
return ret;
}
}
列挙インスタンスは、定義により、シングルトンです。各enumインスタンスのインスタンスは、設計上、1つしかありません。あなたができる唯一のことは、その参照をコピーすることです。
JB Nizetの答えが正しい。あなたが(A) super.clone()
代わりのnew A()
を呼び出して、あなたのその必要があります
class A implements Cloneable {
String id;
Enum state;
int flags;
public A clone() {
A ret = (A) super.clone();
ret.id = id;
ret.state = state; // Enum is a singleton, so this is ok
ret.flags = flags;
return ret;
}
}
注:しかし、また、あなたがObject.clone()
を上書きしようとしていただけの場合にはは、Javaでオブジェクトをクローニングする公式の方法は、このようなものであるに注意してくださいクラスはCloneable
インターフェイスを実装する必要があります。
Java疑似コードが 'Object.clone()'をオーバーライドしようとしている場合は注意してください:正しく実装されていません! 'clone()'の契約を破ることなく 'new A()'をすることはできません。あなたのメソッドが 'Object.clone()'と無関係ならば、混乱を避けるために名前を変更する方が良いでしょう。 –