Spec-Zone.ru › Dart 2

dart:core

Класс Finalizer<T>

Финализатор, который может быть прикреплён к объектам Dart.

Финализатор может создавать связи между финализатором и любым количеством значений Dart, вызывая attach со значением, вместе с токеном финализации и необязательным ключом прикрепления, которые являются частью связи.

Когда значение Dart становится недоступным для программы, любой финализатор, у которого есть связь со значением, может вызвать свою функцию обратного вызова с токеном финализации связи.

Пример:

class Database {
  // Keeps the finalizer itself reachable, otherwise it might be disposed
  // before the finalizer callback gets a chance to run.
  static final Finalizer<DBConnection> _finalizer =
      Finalizer((connection) => connection.close());

  final DBConnection _connection;

  Database._fromConnection(this._connection);

  factory Database.connect() {
    // Wraps the connection in a nice user API,
    // *and* closes connection if the user forgets to.
    final connection = DBConnection.connect();
    final wrapper = Database._fromConnection(connection);
    // Get finalizer callback when `wrapper` is no longer reachable.
    _finalizer.attach(wrapper, connection, detach: wrapper);
    return wrapper;
  }

  void close() {
    // User requested close.
    _connection.close();
    // Detach from finalizer, no longer needed.
    _finalizer.detach(this);
  }

  // Some useful methods.
}

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

Гарантий, что обратный вызов будет когда-либо вызван, не даётся. Единственное гарантированное условие — если обратный вызов финализатора вызван со специфическим токеном финализации в качестве аргумента, тогда, по крайней мере, одно значение с прикреплением к финализатору, имеющее этот токен финализации, больше не доступно программе.

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

Если к одному объекту прикреплено несколько финализаторов или один и тот же финализатор прикреплён несколько раз к объекту, и этот объект становится недоступным для программы, то любое количество (включая ноль) этих прикреплений может вызвать обратный вызов соответствующего финализатора. Не гарантируется, что это будут все или ни одного.

Обратные вызовы финализации происходят как события. Они не будут происходить во время выполнения другого кода и не как микрозадача, а как события высокого уровня, аналогичные событиям таймера.

Обратные вызовы финализации не должны вызывать исключения.

При выполнении на родной платформе Dart, и если обратный вызов — это нативная функция, а не функция Dart, используйте dart:ffi's NativeFinalizer вместо этого.

Аннотации
  • @Since("2.17")

Конструкторы

Finalizer(void callback(T))
factory
Создаёт финализатор с заданным обратным вызовом финализации.

Свойства

hashCode → int
только для чтения, унаследованно
Код хэша для этого объекта.
runtimeType → Type
только для чтения, унаследованно
Представление типа объекта во время выполнения.

Методы

attach(Object value, T finalizationToken, {Object? detach}) → void
Прикрепляет этот финализатор к value.
detach(Object detach) → void
Открепляет этот финализатор от значений, прикреплённых с помощью detach.
noSuchMethod(Invocation invocation) → dynamic
унаследованно
Вызывается при обращении к несуществующему методу или свойству.
toString() → String
унаследованно
Строковое представление этого объекта.

Операторы

operator ==(Object other) → bool
унаследованно
Оператор равенства.

© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-core/Finalizer-class.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API