Именованный конструктор Dart, метод stati c и конструктор фабрики - PullRequest
1 голос
/ 07 августа 2020

Учитывая следующий код:

const jsonString = '{"myString":"Hello"}';
final jsonMap = jsonDecode(jsonString);

final myObject = MyClass.fromJson(jsonMap);

Сколько существует способов создать новый объект с использованием этого синтаксиса:

MyClass.fromJson(jsonMap)

Недавно я пытался понимать различия между именованными конструкторами, конструкторами фабрик и методами stati c, поэтому я публикую свой ответ ниже, чтобы мне было на что вернуться в качестве справочного материала в будущем.

1 Ответ

1 голос
/ 07 августа 2020

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

MyClass.fromJson(jsonMap)

Для использования со следующим кодом:

// import 'dart:convert';

const jsonString = '{"myString":"Hello"}';
final jsonMap = jsonDecode(jsonString);

final myObject = MyClass.fromJson(jsonMap);

Есть как минимум следующие способы сделать it (с дополнительными примечаниями о характеристиках каждого из них):

Генеративный конструктор

class MyClass {
  MyClass(this.myString);
  final String myString;

  MyClass.fromJson(Map<String, dynamic> json) : this(json['myString']);
}

Есть два типа генеративных конструкторов: именованные и безымянные. MyClass.fromJson() - именованный конструктор, а MyClass() - безымянный конструктор. К генеративным конструкторам применяются следующие принципы:

  • Генеративные конструкторы могут создавать только экземпляр самого класса.
  • Генеративные конструкторы могут использовать список инициализаторов.
  • Генеративные конструкторы могут только используйте параметры инициализации или список инициализаторов для установки final свойств, то есть не в теле конструктора.
  • Генеративные конструкторы могут иметь const, даже если они не перенаправляют.

Конструктор фабрики

class MyClass {
  MyClass(this.myString);
  final String myString;

  factory MyClass.fromJson(Map<String, dynamic> json) {
    return MyClass(json['myString']);
  }
}
  • Конструкторы фабрики могут возвращать подтип класса.
  • Конструкторы фабрики могут использоваться для создания одиночных объектов.
  • Конструкторы фабрики могут быть безымянными, как генеративные конструкторы.
  • Фабричные конструкторы могут быть const, но только при перенаправлении.

Stati c method

class MyClass {
  MyClass(this.myString);
  final String myString;

  static MyClass fromJson(Map<String, dynamic> json) {
    return MyClass(json['myString']);
  }
}
  • Методы Stati c могут использоваться для создания синглтонов.
  • Stat i c методы могут использоваться как отрывные.

Дополнительная литература

...