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: 3Essayez 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
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne