Могу ли я установить объект (ссылающийся на анонимный внутренний класс) на «ноль» внутри его метода? - PullRequest
1 голос
/ 05 августа 2011

У меня есть private метод внутри class A, как показано ниже:

class A
{
  //...

  private void initPlay(final long duration)
  {
    myTimer = new Utils.Timer(duration)  // non-static member variable
    {
      @Override
      public void timerExpired(Object o)
      {
        // ... do something
        myTimer = null;
        initReplay();  // unrelated method
      }
    };
  }
}

myTimer относится к анонимному внутреннему class, который реализует абстрактный метод Utils.Timer timerExpired(Object).

Теперь, когда таймер истек и этот метод вызван, я просто устанавливаю myTimer = null;. Это назначение сделано просто для того, чтобы убедиться, что нет никаких ссылок на этот объект, и GC может убрать его, когда найдет.

Это нормально делать? Есть ли побочный эффект (кроме нулевых проверок, о которых я уже позаботился)?

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Если myTimer является экземпляром (или статической) переменной, то вы можете, да - но вам следует опасаться возможности вызова initPlay дважды - что приведет к первомуодин, имеющий право на сборку мусора на ранней стадии (при условии, что больше ничего не содержит ссылку на таймер).

0 голосов
/ 05 августа 2011

Если вам нужен доступ к локальной переменной myTimer, вы должны объявить вашу переменную myTimer с окончательным ключом. Но если вы сделаете это, локальная переменная myTimer может быть переназначена. На самом деле, вам не нужно этого делать, GC соберет его автоматически.

...