Pubblicità

L’initializer list in Dart per la costruzione di un oggetto

1. Inizializzare Campi Finali Non Nullabili

Dart richiede che i campi finali non nullabili siano inizializzati nel momento della creazione dell’oggetto. L’initializer list in Dart per la costruzione di un oggetto è perfetta per questo scopo.

dartCopia codiceclass Point {
  final int x;
  final int y;

  Point(int x, int y)
      : x = x,
        y = y;
}

In questo esempio, i campi x e y vengono inizializzati con i valori forniti dal costruttore.

2. Inizializzare Variabili in Base a Parametri Calcolati

Puoi eseguire operazioni o calcoli sui parametri del costruttore e assegnare i risultati ai campi della classe.

dartCopia codiceclass Rectangle {
  final int width;
  final int height;
  final int area;

  Rectangle(int width, int height)
      : width = width,
        height = height,
        area = width * height;
}

Qui, area viene calcolata utilizzando width e height e viene inizializzata nella initializer list.

3. Inizializzare Campi con Valori di Default

Puoi impostare valori di default per i campi, che possono essere sovrascritti se i parametri vengono passati.

dartCopia codiceclass Car {
  final String brand;
  final String model;
  final int year;

  Car({this.brand = 'Toyota', this.model = 'Corolla', this.year = 2020});
}

In questo caso, brand, model, e year hanno valori di default che possono essere sovrascritti se il costruttore viene chiamato con parametri diversi.

4. Chiamata a Costruttori Named o Factory

Puoi utilizzare L’initializer list in dart per chiamare altri costruttori della stessa classe o costruttori named (chiamati anche costruttori factory).

dartCopia codiceclass Color {
  final int red;
  final int green;
  final int blue;

  Color.black() 
      : red = 0,
        green = 0,
        blue = 0;

  Color.white()
      : red = 255,
        green = 255,
        blue = 255;
}

In questo esempio, Color.black() e Color.white() sono costruttori named che utilizzano l’initializer list per impostare i valori dei campi.

5. Inizializzare Campi Statici

Anche se i campi statici vengono spesso inizializzati al di fuori del costruttore, puoi usare l’initializer list per inizializzare campi statici di istanza, se necessario.

dartCopia codiceclass Counter {
  static int _count = 0;
  final int id;

  Counter() : id = _count++;
}

Qui, ogni volta che viene creato un oggetto Counter, il campo id ottiene un valore incrementale unico.

6. Gestire Condizioni e Logica Complessa

Puoi usare operatori ternari o eseguire altre operazioni logiche all’interno della initializer list per decidere come inizializzare i campi.

dartCopia codiceclass Employee {
  final String name;
  final int salary;

  Employee(this.name, int baseSalary)
      : salary = baseSalary < 3000 ? 3000 : baseSalary;
}

In questo esempio, salary viene inizializzato a un minimo di 3000, indipendentemente dal valore di baseSalary.

7. Ereditarietà e Inizializzazione Avanzata

Puoi usare l’initializer list per passare valori derivati ai costruttori delle classi base.

dartCopia codiceclass Person {
  final String name;
  final int age;

  Person(this.name, this.age);
}

class Student extends Person {
  final int grade;

  Student(String name, int age, int grade)
      : grade = grade,
        super(name, age);
}

Qui, Student passa i valori necessari al costruttore della superclasse Person tramite l’initializer list.

8. Chiamate a Metodi o Funzioni

Anche se meno comune, è possibile utilizzare funzioni o metodi all’interno della initializer list, purché la loro esecuzione sia deterministica.

dartCopia codiceclass Circle {
  final double radius;
  final double area;

  Circle(this.radius)
      : area = _calculateArea(radius);

  static double _calculateArea(double radius) => 3.14 * radius * radius;
}

In questo esempio, _calculateArea viene chiamata nella initializer list per calcolare area.

Conclusione

L’initializer list in Dart offre un potente strumento per gestire l’inizializzazione degli oggetti in maniera ordinata e controllata. È particolarmente utile per garantire che i campi finali siano inizializzati correttamente e per passare dati ai costruttori delle classi base in una gerarchia di ereditarietà. Inoltre, consente di gestire operazioni e logiche complesse che possono essere necessarie durante la costruzione dell’oggetto.