Один экземпляр класса в Dart
Иногда тип должен существовать в единственном экземпляре.
Конструктор делают приватным Post._(), а единственный
объект хранят в static final. Снаружи доступно
только поле instance:
class Post {
Post._();
static final Post instance = Post._();
String title = "";
}
var a = Post.instance;
var b = Post.instance;
print(identical(a, b));
print(a.title);
Функция identical сравнивает ссылки. Для двух
обращений к Post.instance результат true -
это один и тот же объект в памяти.
Такой прием называют singleton - «одиночка». Им пользуются для общих настроек, счетчиков и кэша, когда несколько копий сломали бы смысл задачи. Состояние можно хранить в полях этого единственного объекта:
class Post {
Post._();
static final Post instance = Post._();
int total = 0;
void hit() {
total = total + 1;
}
}
Post.instance.hit();
Post.instance.hit();
print(Post.instance.total);
Если нужны много независимых записей, подходит обычный
публичный конструктор. Приватный конструктор и
static final instance выбирают, когда общий
доступ к одному объекту - часть дизайна, а не случайность.
Фабричный конструктор тоже может возвращать тот же
instance вместо нового объекта.
Сделайте класс Employee с приватным конструктором,
полем static final instance и свойством
token со значением "abc". Сохраните
ссылки в first и second, обе равные
Employee.instance. Выведите результат
identical(first, second).
Дан следующий код:
class Employee {
Employee._();
static final Employee instance = Employee._();
int total = 0;
void register() {
total = total + 1;
}
}
Вызовите register два раза через
Employee.instance и выведите total.