Original article: Constructors in Dart – Use Cases and Examples

La mayoría de nosotros estamos familiarizados con el concepto de constructores. Nos permiten crear diferentes instancias de nuestras clases. Podemos especificar de qué parámetros debe depender la clase cuando se crea una instancia y ocultar la lógica de inicialización interna.

Podemos tener muchos constructores para diferentes casos de uso, o podemos confiar en el predeterminado.

En dart, los constructores juegan un papel similar, pero tienen algunas variaciones que no existen en la mayoría de los lenguajes de programación. Este artículo repasa los diferentes casos de uso y ejemplos de constructores.

En todos los ejemplos de este artículo, usaremos la siguiente clase:

class Coche {
   String fabricacion;
   String modelo;
   String anyoFabricacion;
   bool tieneABS;
}

Cómo empezar con los constructores en Dart

Si no especificas ningún constructor en Dart, crearás un constructor predeterminado.

Esto no significa que verás un constructor predeterminado generado en su clase. En cambio, al crear una nueva instancia de tu clase, se llamará a este constructor. No tendrá argumentos y llamará al constructor de la superclase, sin argumentos también.

Para declarar un constructor en tu clase, puedes hacer lo siguiente:

class Coche {
	String fabricacion;
   	String modelo;
   	String anyoFabricacion;
   	bool tieneABS;
   
   	Coche(String fabricacion, String modelo, int anyo, bool tieneABS) {
    	this.fabricacion = fabricacion;
      	this.modelo = modelo;
      	this.anyoFabricacion = anyo;
      	this.tieneABS = tieneABS;
   	}
}

Como puedes imaginar, debe haber una mejor manera de inicializar nuestros campos de clase, y en Dart, la hay:

class Coche {
	String fabricacion;
   	String modelo;
   	String anyoFabricacion;
   	bool tieneABS;
   
   	Coche(this.fabricacion, this.modelo, this.anyoFabricacion, this.tieneABS);
}

La forma que usamos arriba es una sintaxis sencilla que Dart tiene para simplificar la asignación.

image-321
Photo by Alessio Lin / Unsplash

Funciones de constructor más complejas

En otros idiomas, es posible sobrecargar tu constructor. Esto significa que puedes tener diferentes constructores con el mismo nombre, pero con una firma diferente (o un conjunto diferente de argumentos).

Constructores con nombre en Dart

En Dart, esto no es posible, pero hay una forma de hacer algo semejante. Se llama constructores con nombre. Dar a tus constructores diferentes nombres le permite a tu clase tener muchos constructores y también representar mejor sus casos de uso fuera de la clase.

class Coche {
	String fabricacion;
   	String modelo;
   	String anyoFabricacion;
   	bool tieneABS;
   
   	Coche(this.fabricacion, this.modelo, this.anyoFabricacion, this.tieneABS);
   
   	Coche.sinABS(this.fabricacion, this.modelo, this.anyoFabricacion): tieneABS = false;
}
Ejemplo de constructor con nombre

El constructor sinABS inicializa la variable de instancia tieneABS en falso, antes de que se ejecute el cuerpo del constructor. Esto se conoce como lista de inicializadores y puede inicializar varias variables, separadas por una coma.

El caso de uso más común para las listas de inicializadores es inicializar los campos finales declarados por tu clase.

✋ Cualquier cosa que se coloque en el lado derecho de los dos puntos (:) no tiene acceso a this.

Constructores de Factorías en Dart

Un constructor de factoría es un constructor que se puede usar cuando no necesariamente deseas que un constructor cree una nueva instancia de tu clase.

Esto podría ser útil si tienes instancias de tu clase en la memoria y no deseas crear una nueva cada vez (o si la operación de crear una instancia es costosa).

Otro caso de uso es si tienes cierta lógica en tu constructor para inicializar un campo final que no se puede hacer en la lista de inicializadores.

class Coche {
	String fabricacion;
   	String modelo;
   	String anyoFabricacion;
   	bool tieneABS;
   
   	factory Coche.ford(String modelo, String anyoFabricacion, bool tieneABS) {
    	return CocheFord(modelo, anyoFabricacion, tieneABS);
    }
}

class CocheFord extends Coche {
	CocheFord(String modelo, String anyoFabricacion, bool tieneABS): super("Ford", modelo, anyoFabricacion, tieneABS);
 
}
Ejemplo de constructor de factoría

Constructores avanzados en Dart

Constructores de constantes y constructores de redireccionamiento en Dart

Dart también te permite crear constructores de constantes. ¿Qué significa exactamente? Si tu clase representa un objeto que nunca cambiará después de su creación, puede beneficiarse del uso de un constructor de constante. Debes asegurarte de que todos los campos de tu clase sean definitivos.

class FordFocus {
   static const FordFocus fordFocus = FordFocus("Ford", "Focus", "2013", true);
   
   final String fabricacion;
   final String modelo;
   final String anyoFabricacion;
   final bool tieneABS;
   
   const FordFocus(this.fabricacion, this.modelo, this.anyoFabricaion, this.tieneABS);
   
}
Ejemplo de constructor de constante

Cuando deseas que un constructor llame a otro constructor en segundo plano, se le denomina constructores de redireccionamiento.

class Coche {
	String fabricacion;
   	String modelo;
   	String anyoFabricacion;
   	bool tieneABS;
   
   	Coche(this.fabricacion, this.modelo, this.anyoFabricacion, this.tieneABS);
   
   	Coche.sinABS(this.fabricacion, this.modelo, this.anyoFabricacion): this(fabricacion, modelo, anyoFabricacion, false);
}
Ejemplo de constructor de redirección

Para acabar

Cada uno de los constructores que discutimos tiene un propósito y un caso de uso diferente. Depende de ti determinar y comprender cuándo usar cada uno. Con suerte, este artículo te dio el conocimiento necesario para hacerlo.