Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 13 из 110.

Константный конструктор создает объекты-константы времени компиляции. Когда вы создаете объекты с одинаковыми значениями, используя конструктор const, Dart повторно использует тот же экземпляр в памяти, повышая производительность.

Чтобы создать константный конструктор, добавьте ключевое слово const перед именем конструктора и убедитесь, что все переменные экземпляра помечены как final:

class Color {
  final int red;
  final int green;
  final int blue;

  const Color(this.red, this.green, this.blue);
}

const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);

print(identical(white, alsoWhite)); // true

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

Вы также можете использовать конструкторы const без ключевого слова const, что создает обычные (неконстантные) экземпляры:

var red = Color(255, 0, 0);       // Обычный экземпляр
const blue = Color(0, 0, 255);    // Константный экземпляр

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

challenge icon

Задание

Легко

Давайте создадим систему конфигурации для простой игры, которая использует константные конструкторы для определения неизменяемых, переиспользуемых настроек.

Вы создадите два файла для организации вашего кода:

  • difficulty.dart: Определите класс Difficulty, который представляет настройки сложности игры. Ваш класс должен иметь:
    • Три final поля: name (String), enemyCount (int) и playerLives (int)
    • Константный конструктор, который инициализирует все три поля
    • Метод display(), который выводит информацию о сложности
  • main.dart: Импортируйте ваш класс сложности и создайте три константных пресета сложности:
    • easy с именем 'Easy', 5 врагами и 5 жизнями
    • medium с именем 'Medium', 10 врагами и 3 жизнями
    • hard с именем 'Hard', 20 врагами и 1 жизнью
    Создайте все три объекта как константы времени компиляции, используя ключевое слово const. Затем вызовите display() для каждого в указанном выше порядке. Наконец, проверьте, являются ли два объекта const Difficulty('Easy', 5, 5) идентичными, используя identical(), и выведите результат.

Метод display() должен выводить данные именно в таком формате:

[name]: [enemyCount] enemies, [playerLives] lives

Ожидаемый вывод:

Easy: 5 enemies, 5 lives
Medium: 10 enemies, 3 lives
Hard: 20 enemies, 1 lives
true

Шпаргалка

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

Чтобы создать константный конструктор, добавьте ключевое слово const перед именем конструктора и убедитесь, что все переменные экземпляра помечены как final:

class Color {
  final int red;
  final int green;
  final int blue;

  const Color(this.red, this.green, this.blue);
}

Создание константных экземпляров с идентичными значениями приводит к созданию одного и того же объекта в памяти:

const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);

print(identical(white, alsoWhite)); // true

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

var red = Color(255, 0, 0);       // Обычный экземпляр
const blue = Color(0, 0, 255);    // Константный экземпляр

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

Попробуйте сами

import 'difficulty.dart';

void main() {
  // TODO: Создайте три константных пресета сложности, используя ключевое слово const:
  // - easy: name 'Easy', 5 enemies, 5 lives
  // - medium: name 'Medium', 10 enemies, 3 lives
  // - hard: name 'Hard', 20 enemies, 1 life
  
  // TODO: Вызовите display() для каждого уровня сложности по порядку: easy, medium, hard
  
  // TODO: Проверьте, являются ли два объекта const Difficulty('Easy', 5, 5) идентичными
  // используя identical() и выведите результат
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование