Pull to refresh

Getters и Setters в Dart и Flutter

Reading time2 min
Views39K

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}');
}

Запустить код в Dartpad.


Каждое свойство в данном классе имеет неявный 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.


Запустив код в 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);
}

Запустить код в Dartpad.


Вообще getter & setter используются так часто, что в Android Studio встроено их автосоздание. Когда курсор на свойстве нажимаем Command+N (в Windows Ctrl+N) и в контекстном меню будет их создание.


Всем хорошего кодинга!

Tags:
Hubs:
Total votes 10: ↑7 and ↓3+4
Comments6

Articles