Глубокое погружение в конструкторы 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 Example
class User {
  User._internal();
  static final User _singleton = Singleton._internal();

  factory User() => _singleton;
}

Рекомендации





Разница между «конструктором фабрики и статическим методом
Если вы уже использовали Dart, скорее всего, вы слышали о ключевом слове фабрики. Также вероятно, что вы видели…dash-overflow.net»









Спасибо за чтение!

Я постарался создать максимально простые примеры. Надеюсь, вам понравится.

Если вам понравилась эта статья, нажмите кнопку 👏 (знали ли вы, что можете дойти до 50?)