Getters и Setters в Dart и Flutter.
Как и во многих других языках getters\setters это методы которые дают доступ на чтение\запись свойств объекта.
В статье рассмотрим простые примеры и запустим их на выполнение в dartpad.
В языке Dart чтение и запись любых свойств объектов реализованы с помощью getters\setters.
Например, посмотрим на код
class Person {
String name;
int birthYear;
Person(this.name, this.birthYear);
}
void main() {
Person person = Person('username', 1990);
print('Hello ${person.name}, you was born in ${person.birthYear}');
person.name = 'Newusername';
print('Hello ${person.name}, you was born in ${person.birthYear}');
}
Каждое свойство в данном классе имеет неявный setter для записи в него и неявный getter для получения значения.
Когда мы вызываем person.name = ‘Newusername’;
то мы обращаемся к setter класса. А после этого получаем его значение person.name
с помощью getter.
В Dart мы можем (и это рекомендуется делать для абстракционирования кода) создавать свои getters и setters. Это позволяет нам инициализировать наши классы свойствами, а в будущем обертывать их разными методами без изменения клиентского кода.
Например, допустим наш проект с классом Person развился и нам понадобилось определять совершеннолетие. Мы можем это сделать без изменения конструктора и базовых свойств объекта.
class Person {
String name;
int birthYear;
bool get isAdult => (DateTime.now().year - birthYear) > 18;
Person(this.name, this.birthYear);
}
void main() {
Person personAdult = Person('adultUser', 1990);
print('Hello ${personAdult.name}, you was born in ${personAdult.birthYear}, you are
${personAdult.isAdult ? 'adult' : 'not adult'}');
Person personNotAdult = Person('adultUser', 2005);
print('Hello ${personNotAdult.name}, you was born in ${personNotAdult.birthYear},
you are ${personNotAdult.isAdult ? 'adult' : 'not adult'}');
}
Запустив код в Dartpad мы видим, что мы добавили новое поведение класса, при этом уже созданный клиентский код не будет затронут и все продолжит работать.
Таким же образом, если в какой-то части проекта у нас появилась работа с возрастом, а не с датой рождения, то мы можем добавить setter для записи дня рождения при указании возраста.
class Person {
String name;
int birthYear;
bool get isAdult => (DateTime.now().year - birthYear) > 18;
int get age => (DateTime.now().year - birthYear);
set age(int val) => birthYear = (DateTime.now().year - val);
Person(this.name, this.birthYear);
}
void main() {
Person personAdult = Person('adultUser', 1990);
print('Hello ${personAdult.name}, you was born in ${personAdult.birthYear}, you are
${personAdult.isAdult ? 'adult' : 'not adult'}');
Person personNotAdult = Person('adultUser', 2005);
print('Hello ${personNotAdult.name}, you was born in ${personNotAdult.birthYear},
you are ${personNotAdult.isAdult ? 'adult' : 'not adult'}');
//check how setter work
print(personAdult.birthYear);
personAdult.age = 5;
print(personAdult.birthYear);
}
Вообще getter & setter используются так часто, что в Android Studio встроено их автосоздание. Когда курсор на свойстве нажимаем Command+N (в Windows Ctrl+N) и в контекстном меню будет их создание.
Всем хорошего кодинга!