Константы и константные конструкторы классов

Последнее обновление: 03.04.2023

Константы классов

Кроме обычных полей-переменных классы могут определять поля-константы. Для определения константных полей объекта применяется ключевое слово final. Но следует учитывать, что значения констант классов должны быть установлены до вызова тела конструктора.

Первый вариант установки значений констант представляет присвоение им значения при определении:

class Person{

	final String name = "Tom";  // константа
	int age = 0;
	
    Person(int age) {
		
        this.age = age;
	}
	
    void display(){
        print("Name: $name \tAge: $age");
    }
}

void main() {

    Person tom = Person(38);  
    tom.display();      // Name: Tom    Age: 38
}

Здесь поле name, которое представляет имя, определено как константа. И при определении ему присвоено значение:

final String name = "Tom";

Такой вариант можно использовать для каких-то постоянных значений, которые известны уже при определении класса. Однако для имени такой подход вряд ли подходит - мы же хотим, чтобы разные объекты Person имели разные значения поля name, просто чтобы эти значения в дальнейшем нельзя было менять. В случае же выше у нас для всех объектов Person бужет одинаковое значение поля name. И в этом случае мы можем использовать другой вариант - установка константы через инициализатор:

class Person{

	final String name;  // константа
	int age = 0;
	
    Person(String name, int age) : this.name = name {
		
        this.age = age;
	}
    void display() =>print("Name: $name \tAge: $age");
}

void main() {

    Person tom = Person("Tom", 38);  
    tom.display();      // Name: Tom    Age: 38
    Person bob = Person("Bob", 42);  
    bob.display();      // Name: Bob    Age: 42
}

Теперь имя, как и возраст, передается через конструктор, только теперь для установки используется инициализатор, который вызывается до вызова тела конструктора

Person(String name, int age) : this.name = name {

Благодаря этому можно создавать объекты Person с разными именами.

Третим вариантом является установка значения константы непосредственно через параметр констуктора:

class Person{

	final String name;  // константа
	int age = 0;
	
    Person(this.name, int age){
		
        this.age = age;
	}
    void display() => print("Name: $name \tAge: $age");
}

void main() {

    Person tom = Person("Tom", 38);  
    tom.display();      // Name: Tom    Age: 38
    Person bob = Person("Bob", 42);  
    bob.display();      // Name: Bob    Age: 42
}

Указывая вместо параметра this.name, мы автоматически связываем первый параметр с константой name:

Person(this.name, int age){

Константные объекты

Объекты классов сами могут представлять константы. Ключевое слово final позволяет определить константы времени выполнения

class Person{

	final String name;  // константа
	int age;
	
    Person(this.name, this.age){}
	
    void display() => print("Name: $name \tAge: $age");
}

void main() {

    final Person tom = Person("Tom", 38);  
    // tom = Person("Tomas", 18);  // так нельзя
    tom.age = 22;       // так можно
    tom.display();      // Name: Tom    Age: 22
}

Здесь tom определена как константа с помощью ключевого слова final

final Person tom = Person("Tom", 38); 

И поскольку это константы, мы не можем изменить объект, на который ссылается данная константа:

tom = Person("Tomas", 18);  // так нельзя

Однако мы можем изменить значения отдельных полей, которые не являются константами, например, поля age:

tom.age = 22;       // так можно
tom.display();      // Name: Tom    Age: 22

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

Классы могут содержать константные конструкторы. Такие конструкторы призваны создавать объекты, которые не должны изменяться. Константные конструкторы предваряются ключевым словом const. Класс, который определяет подобный конструктор, не должен содержать переменных, но может определять константы. Кроме того, константые конструкторы не имеют тела:

class Person{

	final String name;  // константа
	final int age;      // константа
	
    const Person(this.name, this.age);  // константный конструктор
    void display() => print("Name: $name \tAge: $age");
}

void main() {

    const Person tom = Person("Tom", 38);
    tom.display();      // Name: Tom    Age: 38
}

В данном случае и name, и age определены как константы, а единственный конструктор является константным и устанавливает их значения. В программе мы можем определить константный объект с помощью ключевого слова const:

const Person tom = Person("Tom", 38);

В данном случае создается константы этапа компиляции. В ряде сценариев это увеличивает производительность программы. Например, фреймворк Flutter часто использует константные виджеты (элементы управления) в пользовательском интерфейсе приложения. Поскольку Flutter знает, что виджеты являются константными, неизменяемыми, ему не нужно тратить время на пересчет и отрисовку макета при использовании этих виджетов.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850