Méthodes et champs statiques
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 20 sur 110.
Maintenant que vous comprenez la différence entre les membres d'instance et les membres statiques, explorons comment utiliser efficacement les méthodes et les champs statiques. Les membres statiques sont parfaits pour les fonctionnalités qui appartiennent au concept de classe lui-même plutôt qu'aux objets individuels.
Les champs statiques stockent des données partagées entre toutes les instances. Les utilisations courantes incluent les compteurs, les valeurs de configuration ou les données mises en 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); // 2Remarquez que vous appelez les méthodes statiques directement sur le nom de la classe, et non sur une instance. La classe MathHelper fonctionne comme un utilitaire - vous n'avez jamais besoin de créer un objet MathHelper.
Une règle importante : les méthodes statiques ne peuvent pas accéder directement aux membres d'instance. Elles n'ont pas accès à this car elles ne sont liées à aucun objet spécifique :
class Counter {
int value = 0; // Champ d'instance
static int total = 0; // Champ statique
void increment() {
value++; // OK - une méthode d'instance accède à un champ d'instance
total++; // OK - une méthode d'instance peut accéder à un champ statique
}
static void reset() {
total = 0; // OK - une méthode statique accède à un champ statique
// value = 0; // Erreur ! Impossible d'accéder à un champ d'instance
}
}Utilisez des membres statiques lorsque la fonctionnalité ne dépend pas de l'état de l'objet - les fonctions utilitaires, le suivi de fabrique ou les constantes partagées sont des candidats idéaux.
Défi
FacileConstruisons une classe utilitaire pour les opérations sur les chaînes de caractères qui démontre comment les méthodes et les champs statiques collaborent pour fournir des fonctionnalités utiles sans avoir besoin de créer des objets.
Vous allez créer deux fichiers pour organiser votre code :
string_utils.dart: Définissez une classeStringUtilsqui sert d'assistant utilitaire. Votre classe doit comporter :- Une constante
static const String defaultSeparatordéfinie sur'-' - Un entier
static int operationCountcommençant à0pour suivre le nombre d'opérations effectuées - Une méthode statique
reverse(String text)qui incrémenteoperationCountet retourne la chaîne inversée - Une méthode statique
join(String first, String second)qui incrémenteoperationCountet retourne les deux chaînes jointes avec ledefaultSeparator - Une méthode statique
countVowels(String text)qui incrémenteoperationCountet retourne le nombre de voyelles (a, e, i, o, u - insensible à la casse) - Une méthode statique
getStats()qui retourne une chaîne affichant le total des opérations effectuées
- Une constante
main.dart: Importez votre classe utilitaire et utilisez ses méthodes statiques :- Appelez
reverse()avec'hello'et affichez le résultat - Appelez
join()avec'dart'et'lang'et affichez le résultat - Appelez
countVowels()avec'Programming'et affichezVowels: [count] - Affichez les statistiques en utilisant
getStats()
- Appelez
N'oubliez pas d'appeler toutes les méthodes directement sur le nom de la classe puisqu'elles sont statiques - vous ne créerez aucun objet StringUtils.
La méthode getStats() doit retourner ce format :
Operations performed: [operationCount]Résultat attendu :
olleh
dart-lang
Vowels: 3
Operations performed: 3Aide-mémoire
Les membres statiques appartiennent à la classe elle-même plutôt qu'aux instances individuelles. Accédez-y en utilisant le nom de la classe, et non un objet.
Les champs statiques stockent des données partagées entre toutes les instances :
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.calculationCount); // 1Règles d'accès :
- Les méthodes d'instance peuvent accéder aux membres d'instance et aux membres statiques
- Les méthodes statiques ne peuvent accéder qu'aux membres statiques (pas d'accès à
this)
class Counter {
int value = 0; // Champ d'instance
static int total = 0; // Champ statique
void increment() {
value++; // OK - méthode d'instance accédant à un champ d'instance
total++; // OK - une méthode d'instance peut accéder à un champ statique
}
static void reset() {
total = 0; // OK - méthode statique accédant à un champ statique
// value = 0; // Erreur ! Impossible d'accéder à un champ d'instance
}
}Utilisez les membres statiques pour les fonctions utilitaires, les constantes partagées, les compteurs ou les fonctionnalités qui ne dépendent pas de l'état de l'objet.
Essayez vous-même
import 'string_utils.dart';
void main() {
// À FAIRE : Appeler reverse() avec 'hello' et afficher le résultat
// À FAIRE : Appeler join() avec 'dart' et 'lang' et afficher le résultat
// À FAIRE : Appeler countVowels() avec 'Programming' et afficher "Vowels: [count]"
// À FAIRE : Afficher les statistiques en utilisant getStats()
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository