Metodi e campi statici
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 20 di 110.
Ora che hai capito la differenza tra membri di istanza e statici, esploriamo come usare efficacemente metodi e campi statici. I membri statici sono perfetti per le funzionalità che appartengono al concetto stesso di classe, anziché ai singoli oggetti.
I campi statici memorizzano dati condivisi tra tutte le istanze. Gli usi più comuni includono contatori, valori di configurazione o dati memorizzati nella cache:
class MathHelper {
static const double pi = 3.14159;
static int calculationCount = 0;
static double circleArea(double radius) {
calculationCount++;
return pi * radius * radius;
}
}
print(MathHelper.circleArea(5)); // 78.53975
print(MathHelper.circleArea(3)); // 28.27431
print(MathHelper.calculationCount); // 2Nota che chiami i metodi statici direttamente sul nome della classe, non su un'istanza. La classe MathHelper funziona come un'utilità: non devi mai creare un oggetto MathHelper.
Una regola importante: i metodi statici non possono accedere direttamente ai membri di istanza. Non hanno accesso a this perché non sono associati a un oggetto specifico:
class Counter {
int value = 0; // Campo di istanza
static int total = 0; // Campo statico
void increment() {
value++; // OK - il metodo di istanza accede al campo di istanza
total++; // OK - il metodo di istanza può accedere al campo statico
}
static void reset() {
total = 0; // OK - il metodo statico accede al campo statico
// value = 0; // Errore! Impossibile accedere al campo di istanza
}
}Usa i membri statici quando la funzionalità non dipende dallo stato dell’oggetto: le funzioni di utilità, il tracciamento delle factory o le costanti condivise sono candidati ideali.
Sfida
FacileCreiamo una classe di utilità per le operazioni sulle stringhe, che mostri come i metodi e i campi statici collaborano per offrire funzionalità utili senza dover creare oggetti.
Creerai due file per organizzare il codice:
string_utils.dart: Definisci una classeStringUtilsche funge da helper di utilità. La classe dovrebbe avere:- Un
static const String defaultSeparatorimpostato su'-' - Un
static int operationCountinizializzato a0per tenere traccia del numero di operazioni eseguite - Un metodo statico
reverse(String text)che incrementaoperationCounte restituisce la stringa invertita - Un metodo statico
join(String first, String second)che incrementaoperationCounte restituisce le due stringhe unite condefaultSeparator - Un metodo statico
countVowels(String text)che incrementaoperationCounte restituisce il numero di vocali (a, e, i, o, u, senza distinzione tra maiuscole e minuscole) - Un metodo statico
getStats()che restituisce una stringa con il totale delle operazioni eseguite
- Un
main.dart: Importa la classe di utilità e usa i suoi metodi statici:- Chiama
reverse()con'hello'e stampa il risultato - Chiama
join()con'dart'e'lang'e stampa il risultato - Chiama
countVowels()con'Programming'e stampaVowels: [count] - Stampa le statistiche usando
getStats()
- Chiama
Ricorda di chiamare tutti i metodi direttamente sul nome della classe, poiché sono statici: non creerai alcun oggetto StringUtils.
Il metodo getStats() dovrebbe restituire il testo in questo formato:
Operations performed: [operationCount]Risultato previsto:
olleh
dart-lang
Vowels: 3
Operations performed: 3Provalo tu
import 'string_utils.dart';
void main() {
// TODO: Chiama reverse() con 'hello' e stampa il risultato
// TODO: Chiama join() con 'dart' e 'lang' e stampa il risultato
// TODO: Chiama countVowels() con 'Programming' e stampa "Vowels: [count]"
// TODO: Stampa le statistiche usando getStats()
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online