Именованный конструктор Dart против метода Stati c, что предпочесть? - PullRequest
1 голос
/ 26 мая 2020

Итак, после того, как dart сделал ключевое слово new необязательным,

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

class Color {
  int r = 0, g = 0, b = 0;

  Color({this.r, this.b, this.g});

  //Named constructors
  Color.red() //Implementation

  Color.cyan() //Implementation

  // Static Initializers
  static Color red() => //Initialze with parameter

  static Color cyan() => //Initialze with parameter
}

Мы можем использовать их вот так независимо от того, это named constructor или static method:

Color red = Color.red();
Color cyan = Color.cyan();

Какое место использовать каждый из них?

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Конструкторы и функции c разные. Обычно вы создаете именованный конструктор, который возвращает экземпляр объекта с некоторыми предопределенными значениями. Например, у вас есть класс с именем Person, в котором хранятся Name и Job. Вы можете создать этот именованный конструктор Person.doctor(name), который будет возвращать объект Person с Job = 'doctor'

 class Person{
  final name;
  final job;

  Person(this.name, this.job);

  Person.doctor(this.name, {this.job = "doctor"});

 }

Stati c функциями или переменной, сохраняющейся во всех экземплярах класса. Скажем, Person имеет переменную stati c с именем count. Вы увеличиваете значение переменной count всякий раз, когда создается экземпляр Person. Вы можете позвонить по номеру Person.count в любом месте кода позже, чтобы получить значение count (количество экземпляров Person)

class Person{
  final name;
  final job;
  static int count;

  Person(this.name, this.job){
    count++;
  }

  Person.doctor(this.name, {this.job = "doctor"});

}
1 голос
/ 26 мая 2020

На практике существует небольшая разница между конструктором factory и методом c stati.

Для класса generi c он изменяется там, где вы можете (и должны) напишите параметр типа:

class Box<T> {
  T value;
  Box._(this.value);
  factory Box.withValue(this.value) => Box<T>._(value);
  static Box<T> fromValue<T>(T value) => Box<T>._(value);
}
...
  var box1 = Box<int>.withValue(1);
  var box2 = Box.fromValue<int>(2);

Итак, для общих классов c конструкторы фабрики часто являются тем, что вам нужно. У них самый приятный синтаксис.

Для классов, не являющихся общими c, разница очень небольшая, поэтому в основном речь идет о намерении сигнализации. И решая, в какую категорию входит имя в DartDo c.

Если основная цель функции - создать новый объект, сделайте его конструктором.

Если основная цель заключается в том, чтобы выполнить некоторые вычисления и в конечном итоге вернуть объект (даже если это новый объект), сделать его функцией stati c. Вот почему методы parse обычно являются статическими c функциями.

Короче говоря, делайте то, что кажется правильным для вашего API.

...