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.