Зачем использовать typeof для идентификации функции?

Есть ли какие-нибудь существенные причины для использования

typeof variable === 'function'

вместо

!!variable.call

для определения того, является ли переменная функцией?

Помимо очевидного, что кто-то может создать объект вроде:

{ call: 1 }

У меня проблема в том, что

typeof /regex/ === 'function'

возвращает истину, object, «bar» и передав ему Callable. После этого foo вернется bar, а затем я хочу, чтобы foo стал недоступным (например: ...

Я работаю с некоторым кодом, в котором один объект "foo" создает другой object, "bar" и передав ему Callable . После этого foo вернется bar, а затем я хочу, чтобы foo стал недоступным (т.е. доступным для сборщик мусора).

Моя первоначальная мысль заключалась в том, чтобы просто анонимно создать Callable . например:

class Foo {
  ...

  public Bar createBar() {
    final int arg1 = ...
    final int arg2 = ...
    final int arg3 = ...
    return new Callable<Baz>() {
      @Override
      public Baz call() {
        return new Baz(arg1, arg2, arg3);
      }
    };
  }
}

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

С другой стороны, обнаружение того, что включающий экземпляр никогда не упоминается должно быть довольно тривиальным, поэтому, возможно, компилятор Java достаточно умен не включать ссылку в этом случае.

Итак ... будет ли экземпляр анонимного внутреннего класса удерживать ссылка на его включающий экземпляр, даже если он никогда не использует включающая ссылку на экземпляр?

28
задан Mike Valenty 25 January 2015 в 22:41
поделиться