Константные конструкторы
Часть раздела Объектно-ориентированное программирование путешествия по 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); // Константный экземплярКонстантные конструкторы обычно используются для неизменяемых объектов конфигурации, предопределенных значений, таких как цвета или размеры, и везде, где вы хотите гарантировать неизменяемость объекта, оптимизируя при этом использование памяти.
Задание
ЛегкоДавайте создадим систему конфигурации для простой игры, которая использует константные конструкторы для определения неизменяемых, переиспользуемых настроек.
Вы создадите два файла для организации вашего кода:
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() и выведите результат
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий