преимущество дротика от идентификатора конструктора фабрики - программирование
Подтвердить что ты не робот

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

Я изучал разбор 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, так что есть ли преимущество в объявлении конструктора как фабрики или использование фабрики здесь лишним?

4b9b3361

Ответ 1

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

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

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

Поэтому можно использовать конструктор фабрики

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

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

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

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

Ответ 2

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

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

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

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