Глубокое погружение в конструкторы Dart
Вы найдете все о конструкторах
Прежде всего
Что такое Конструктор?
Конструктор — это специальный метод, который используется для инициализации объектов. Конструктор вызывается при создании объекта класса.
По сути
final ehe = MyClass(); // Creates an instance class MyClass { MyClass(); // Fires immediately when created (this guy is cons.) }
В Конструкторах есть только одно правило!
То есть;
Назовите его так же, как имя его класса!!
Хорошо, мы поняли! но.. .
Какие именно типы конструкторов у нас есть?
Конструктор по умолчанию — Class()
// Default Constructor // Does nothing special class User { String name = 'ehe'; User(); } /////////////////// // Constructor with parameters // Gets parameters and assigns to them to their variables class User { String name; User(this.name); } /////////////////// // Constructor with the initial method // Fires the codes immediately class User { String name; User(this.name) { // do some magic } } ///////////////// // Constructor with assertion // Asserts some rules to parameters class User { String name; User(this.name) : assert(name.length > 3); } //////////////// // Constructor with initializer // You can also initialize the values with customizations tho! class User { static String uppercase(String e) => e.toUpperCase(); String name; User(name) : name = yell(name); static String yell(String e) => e.toUpperCase(); } ///////////////////// // Constructor with super() // you can override the values it extends abstract class Person { String id; Person(this.id); } class User extends Person { String name; User(this.name,String id) : super(id); } ///////////////////// // Constructor with this() // you can redirect the values as well class User { String name; int salary; User(this.name, this.salary); User.worker(String name) : this(name, 10); User.boss(String name) : this(name, 9999999); }
Частный конструктор — класс._()
Вы можете создавать частные конструкторы, используя _, но какая от этого польза?
Давайте посмотрим на пример!
class Print { static void log(String message) => print(message); } Print.log('ehe'); // You want to write an util like this but there is a problem with that, because you can also create an instance which is something we don't want Print(); // it's absolutely unnecassary in this case // How to prevent that? Answer is private constructors! class Print { Print._(); // This one will prevent creating instance static void log(String message) => print(message); } Print(); // This will give compile time error now Your instance is safe now!
Таким образом, вы можете предотвратить создание экземпляра!
Именованный конструктор — Class.named()
Вы можете создавать разные типы экземпляров в одном class
Например;
class User { String name; int salary; User.worker(this.name) : salary = 10; User.boss(this.name) : salary = 99999999; }
Частный именованный конструктор — класс. _имя()
Вы можете легко отмыть свой экземпляр!
class User { String name; int salary; User.worker(this.name) : salary = 10; User.boss(this.name) : salary = 99999999; User._mafia(this.name) : salary = 9999999999999; }
Кроме шуток, это очень полезно!
Например, вы можете создавать синглтоны с помощью частного конструктора!
class User {
User._privateConstructor();
static final User instance = User._privateConstructor();
}
Примечание
Вы можете увидеть ключ _internal
в некоторых проектах. Ничего особенного. Конструкция _internal — это просто имя, которое часто дается конструкторам, которые являются частными для класса (имя не обязательно должно быть ._internal, вы можете создать частный конструктор, используя любой Class._someName).
Конструктор констант — const Class()
Вы можете сделать свой класс неизменным, используя const constructor!
Константный конструктор — это оптимизация! Компилятор делает объект неизменяемым, выделяя одинаковую часть памяти для всех
Text('Hi!')
объектов. — Фрэнк Трейси
const user = User('ehe'); class User { final String name; const User(this.name); }
Factory Constructor — класс фабрики Class()
Мы сказали, что строителям нельзя возвращаться. Угадай, что?
Конструкторы Factory могут!
И что могут сделать заводские конструкторы?
Вам вообще не нужно создавать новый экземпляр! вы можете вызвать другой конструктор или подкласс, и вы даже можете вернуть экземпляр из кеша!!
Наконец, небольшое предостережение для заводов!
Вы не можете вызвать конструктор суперкласса (super()
)
Простые примеры
class User { final String name; User(this.name); factory User.fromJson(Map<String, dynamic> json) { return User(json["name"]); } } // Singleton Exampleclass User { User._internal();
static final User _singleton = Singleton._internal(); factory User() => _singleton; }
Рекомендации
Разница между «конструктором фабрики и статическим методом
Если вы уже использовали Dart, скорее всего, вы слышали о ключевом слове фабрики. Также вероятно, что вы видели…dash-overflow.net»
Спасибо за чтение!
Я постарался создать максимально простые примеры. Надеюсь, вам понравится.
Если вам понравилась эта статья, нажмите кнопку 👏 (знали ли вы, что можете дойти до 50?)