MyObject内にFoo型のオブジェクトmyObjectがある場合、それ自体をリセットしてコンストラクターを再度実行する方法はありますか?
私は次のことがうまくいかないことを知っていますが、アイデアを伝えるのに役立つかもしれません。
this = new Foo();
既存のインスタンスでコンストラクターを再度実行する方法はありません。ただし、次のように、最小限の作業でリセットできるようにコードを整理できます。
public class MyClass {
public MyClass() {
reset();
}
public void reset() {
// Setup the instance
this.field1 = ...
this.field2 = ...
}
}
注:resetメソッドでは、コンストラクターで通常設定するフィールドだけでなく、すべてのフィールドを設定する必要があります。たとえば、コンストラクターは、参照フィールドのnull
へのデフォルトの初期化と、数値フィールドのゼロへの初期化に依存できます。 reset
メソッドは、それらすべてを明示的に設定する必要があります。
Nullを設定するか、new Object()を使用することをお勧めします
obj = null;
or
obj = new Object();
ガベージコレクターは最終的にオブジェクトをクリアします
コードの推論が容易になる傾向があるため人気が高まっている別のアプローチは、オブジェクトを作成することです不変、状態を変更する(リセットするなど)代わりに、単に新しいオブジェクトを作成しますオブジェクト。
オブジェクトのすべての変数(nullまたは0またはデフォルト値)を「リセット」するメソッドを作成するだけです。
クラスのデフォルト値または状態のセットをクラス内に格納します。次に、クラス内のこれらすべてのデフォルトを復元するreset()
メソッドを記述します。
public void reset(){
// Reset everything to your default values
}
@SuppressWarnings({ "unchecked" })
static void emptyObject(Object obj)
{
Class c1 = obj.getClass();
Field[] fields = c1.getDeclaredFields();
for(Field field : fields)
{
try
{
if(field.getType().getCanonicalName() == "boolean")
{
field.set(obj, false);
}
else if(field.getType().getCanonicalName() == "char")
{
field.set(obj, '\u0000');
}
else if((field.getType().isPrimitive()))
{
field.set(obj, 0);
}
else
{
field.set(obj, null);
}
}
catch(Exception ex)
{
}
}}