如果我有一个类型为Foo的对象myObject,而在myObject中,有没有办法重置自己并再次运行构造函数?
我知道以下内容不起作用,但可能有助于传达这一想法。
this = new Foo();
答案 0 :(得分:13)
无法在现有实例上再次运行构造函数。但是,您可以组织代码,以便以最少的工作量进行重置,如下所示:
public class MyClass {
public MyClass() {
reset();
}
public void reset() {
// Setup the instance
this.field1 = ...
this.field2 = ...
}
}
注意:您的reset方法需要设置所有字段,而不仅仅是您通常在构造函数中设置的字段。例如,您的构造函数可以依赖于null
的引用字段和数字字段的默认初始化为零;您的reset
方法需要明确地设置它们。
答案 1 :(得分:6)
最好设置null或使用新的Object()
obj = null;
or
obj = new Object();
垃圾收集器最终将清除对象
答案 2 :(得分:2)
一种替代方法,它越来越受欢迎,因为它往往使代码更易于推理,是使你的对象不可变,而不是改变它们的状态(例如重置它们),简单创建一个新对象。
答案 3 :(得分:1)
只需编写一个方法来“重置”对象的所有变量(null或0或默认值)。
答案 4 :(得分:1)
为您的类存储一组默认值或状态。然后编写一个reset()
方法,该方法将恢复该类中的所有这些默认值。
public void reset(){
// Reset everything to your default values
}
答案 5 :(得分:0)
@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)
{
}
}}