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) и в контекстном меню будет их создание.
Всем хорошего кодинга!
Комментарии (6)
Inobelar
19.08.2019 13:20Я почти не в теме Flutter, но разве статья не о геттерах/сеттерах Dart? Flutter'а (фреймворк, в отличие от ЯП) же сдесь не затрагивается вообще.
psFitz
Автору респект. Очень полезная статья!
Еще хотелось бы почитать про:
1.Hello world на flutter
2.Как создать dart файл
3.Как написать класс на dart
4.Как не писать бесполезные статьи
awaik Автор
Посмотрим, если никому не интересно, то удалю.
На эту статью планировал ссылку в другой большой, в которой сложные паттерны будут.