преимущество дротика идентификатора конструктора фабрики - PullRequest
0 голосов
/ 12 сентября 2018

Я изучал разбор JSON для своего приложения Flutter, и у меня возник вопрос о конструкторах фабрики, который я не могу разрешить.Я пытаюсь понять преимущество использования конструктора фабрики против простого конструктора.Например, я вижу довольно много примеров синтаксического анализа JSON, которые создают класс модели с конструктором JSON, подобным следующему:

class Student{
  String studentId;
  String studentName;
  int studentScores;

  Student({
    this.studentId,
    this.studentName,
    this.studentScores
  });

  factory Student.fromJson(Map<String, dynamic> parsedJson){
    return Student(
      studentId: parsedJson['id'],
      studentName : parsedJson['name'],
      studentScores : parsedJson ['score']
    );
  }
}

Я также видел такое же количество примеров, которые НЕ объявляют конструктор какзавод.Оба типа конструкторов classname.fromJSON создают объект из данных JSON, поэтому есть ли преимущество объявлять конструктор как фабрику или использование фабрики здесь излишне?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Заводской конструктор против обычного конструктора

  • Фабричный конструктор вызывает другой конструктор.
  • Поскольку конструктор фабрики не создает новый экземпляр напрямую, он не может использовать список инициализатора конструктора.
  • Обычный конструктор всегда возвращает новый экземпляр класса. Конструктор фабрики может возвращать существующий экземпляр, экземпляр производного класса или null. (Однако некоторые люди не любят возвращать null из конструктора фабрики .)

Конструктор фабрики против статического метода

  • Конструктор фабрики может быть неназванным конструктором класса по умолчанию.
  • Заводской конструктор может использоваться с new. (Но с использованием new теперь не рекомендуется .)
  • Статические методы могут использоваться для создания отрывов (то есть они могут использоваться как обратные вызовы), но конструкторы в настоящее время не могут .
  • Статические методы могут быть async. (Конструктор фабрики должен возвращать тип своего класса, поэтому он не может возвращать Future.)
0 голосов
/ 12 сентября 2018

Обычный конструктор всегда возвращает новый экземпляр текущего класса (кроме случаев, когда конструктор выдает исключение).

Конструктор фабрики очень похож на статический метод с отличиямичто он

  • может вернуть только экземпляр текущего класса или один из его подклассов
  • может быть вызван с помощью new, но теперь это не так важно, поскольку new стал необязательным.
  • не имеет списка инициализатора (нет : super())

Таким образом, конструктор фабрики может использоваться

  • для создания экземпляров подклассов (например,в зависимости от переданного параметра
  • для возврата кэшированного экземпляра вместо нового
  • для подготовки вычисленных значений для передачи их в качестве параметров в обычный конструктор, чтобы конечные поля могли быть инициализированы с ними.Это часто используется для обхода ограничений того, что можно сделать в списке инициализаторов обычного конструктора (например, обработка ошибок).

В вашем примере этот код

  studentId: parsedJson['id'],
  studentName : parsedJson['name'],
  studentScores : parsedJson ['score']

можно переместить в тело обычного конструктора, поскольку поля final не нужно инициализировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...