我可以取消分配(清除)实例的所有字段吗?

时间:2010-04-08 15:42:16

标签: java oop field clear

是否有一种简单的方法可以清除实例中实例的所有字段?我的意思是,我想删除分配给实例字段的所有值。

ADDED

从主线程我开始一个窗口和另一个控制窗口状态的线程(例如,最后一个线程,显示某段时间的某些面板)。我有一个类,其中包含窗口的状态(用户在哪个阶段,他已经点击了哪些按钮)。

最后,用户可能想要从头开始整个过程​​(这是一个游戏)。所以,我决定了。因此,如果从头开始执行所有操作,我希望所有参数都是干净的(新鲜,未分配)。

ADDED

主线程创建在新线程中执行的新对象(旧线程完成)。所以,我无法从旧线程创建一个新对象。我只是在第二个帖子中有一个循环。

4 个答案:

答案 0 :(得分:4)

我不明白。您如何以编程方式决定如何清除各个字段?

对于普通属性,它可以很容易(var = null),但复合物或集合呢?它应该是collection = null还是collection.removeAll()

这个问题正在寻找没有多大意义的synctactic糖。

最好的方法是编写自己的reset()方法来自定义每个对象的行为。也许你可以使用

模式化
interface Resettable
{
  void reset()
}

但仅此而已......

答案 1 :(得分:4)

  

是否有一种简单的方法可以清除实例中实例的所有字段?我的意思是,我想删除分配给实例字段的所有值。

是的,只需为每个人分配一个默认值即可。这将花费你大约20-30分钟。并将永远运行良好 *(YMMV)

创建一个方法:reset并调用它

class YourClass {
    int a;
    int b;
    boolean c;
    double d;
    String f;
    // and so on... 
    public void method1(){}
    public void method2(){}
    public void method3(){}
    // etc. 
    // Magic method, reset all the attributes of your instance...
    public void reset(){
        a = 0;
        b = 0;
        c = false;
        d = 0.0;
        f = "";
     }
}

然后只需在代码中调用它:

   .... 
   YourClass object = new YourClass();
   Thread thread = YourSpecificNewThread( object );
   thread.start();

   ... // Later on you decide you have to reset the object just call your method:

   object.reset(); // like new

我真的不知道这种方法的问题在哪里。

答案 2 :(得分:1)

您可以使用反射:

尝试这样的事情:

Field[] fields = object.getClass().getDeclaredFields();
for (Field f : fields) {
  f.setAccessible(true);
  f.set(object, null);
}

这不是一个美丽的解决方案,但可能对你有用。

答案 3 :(得分:0)

除了将null设置为所有这些之外别无他法。

顺便说一句,我发现这是一个特别奇怪的想法。您最好重新创建一个新实例,而不是尝试重置旧实例。