Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dart Named constructor vs Static method what to prefer?

Tags:

flutter

dart

So after dart made new keyword optional,

we can initialize an object with exact same syntax but different internal implementation.

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
}

We can use them like this regardless of being it a named constructor or static method:

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

What is the place to use each of them?

like image 356
erluxman Avatar asked Jan 26 '23 00:01

erluxman


1 Answers

In practice there is little difference between a factory constructor and a static method.

For a generic class, it changes where you can (and must) write a type parameter:

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);

So, for generic classes, factory constructors are often what you want. They have the most pleasant syntax.

For non-generic classes, there is very little difference, so it's mainly about signaling intent. And deciding which category the name goes into in the DartDoc.

If the main objective of the function is to create a new object, make it a constructor.

If the main objective is to do some computation and eventually return an object (even if it's a new object), make it a static function. That's why parse methods are generally static functions.

In short, do what feels right for your API.

like image 173
lrn Avatar answered Feb 11 '23 14:02

lrn