Могу ли я отменить (очистить) все поля экземпляра? - PullRequest
3 голосов
/ 08 апреля 2010

Есть ли простой способ очистить все поля экземпляра от экземпляра?Я имею в виду, я хотел бы удалить все значения, назначенные полям экземпляра.

ДОБАВЛЕНО

Из основного потока я запускаю окно и другой поток, который контролируетсостояние окна (последний поток, например, отображает определенные панели за определенный период времени).У меня есть класс, который содержит состояние окна (на какой стадии находится пользователь, какие кнопки он уже нажал).

В конце пользователь может захотеть начать весь процесс с самого начала (этоигра).Итак, я решил.Итак, если все выполняется с самого начала, я бы хотел, чтобы все параметры были чистыми (свежими, неназначенными).

ADDED

Основной поток создаетновый объект, который выполняется в новом потоке (и старый поток завершен).Итак, я не могу создать новый объект из старого потока.У меня просто есть цикл во втором потоке.

Ответы [ 5 ]

4 голосов
/ 08 апреля 2010

Я не понимаю. Как вы можете программно решить, как очистить различные поля?

Для обычных атрибутов это может быть легко (var = null), но как насчет составных вещей или коллекции? Это должно быть collection = null или collection.removeAll()?

Этот вопрос ищет синктактический сахар, который не имеет особого смысла ..

Лучший способ - написать собственный метод reset(), чтобы настроить поведение для каждого отдельного объекта. Может быть, вы можете patternize использовать его, используя

interface Resettable
{
  void reset()
}

но не более того ..

4 голосов
/ 08 апреля 2010

Есть ли простой способ очистить все поля экземпляра от экземпляра? Я имею в виду, я хотел бы удалить все значения, назначенные полям экземпляра.

Да, просто назначьте значение по умолчанию для каждого из них. Это займет у вас около 20-30 минут. и будет работать вечно * (YMMV) * ​​1008 *

Создайте метод: 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

Я действительно не вижу, в чем проблема с этим подходом.

1 голос
/ 08 апреля 2010

Вы можете использовать отражение:

Попробуйте что-то вроде этого:

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

Это не красивое решение, но может работать для вас.

0 голосов
/ 11 апреля 2016

Если вы хотите очистить фильтр (Serializable), чтобы ваше приложение могло обрабатывать его пустые поля, вы можете использовать BeanUtils ( Apache Commons ):

    Field[] fields = filter.getClass().getDeclaredFields();
    for (Field f : fields) {
        if (f.getName().endsWith("serialVersionUID")) {
            continue;
        }
        try {
            BeanUtils.setProperty(filter, f.getName(), null);
        } catch (IllegalAccessException | InvocationTargetException e) {
            FacesUtils.handleError(LOG, "Erro limpar filtro...", e);
        }
    }

Надеюсь, это поможет вам.

0 голосов
/ 08 апреля 2010

Нет другого способа, кроме установки null для всех из них.

Кстати, я обнаружил, что это странная идея. Вам лучше воссоздать новый экземпляр, чем пытаться восстановить старый.

...