527 votes

Comment construisez-vous un Singleton dans Dart?

Le modèle singleton garantit qu'une seule instance d'une classe est créée. Comment puis-je construire cela dans Dart?

792voto

Seth Ladd Points 13589

Grâce aux constructeurs d'usine de Dart, il est facile de créer un singleton:

 class Singleton {
  static final Singleton _singleton = new Singleton._internal();

  factory Singleton() {
    return _singleton;
  }

  Singleton._internal();
}
 

Vous pouvez le construire avec new

 main() {
  var s1 = new Singleton();
  var s2 = new Singleton();
  print(identical(s1, s2));  // true
  print(s1 == s2);           // true
}
 

51voto

Greg Lowe Points 2233

Je ne trouve pas ça très intuitif lecture new Singleton(). Vous devez lire la documentation pour savoir que la nouvelle n'est pas vraiment de la création d'une nouvelle instance, comme il le ferait normalement.

Voici une autre façon de faire des singletons (Fondamentalement, ce que Andrew a dit ci-dessus).

lib/chose.dart

library thing;

final Thing thing = new Thing._private();

class Thing {
   Thing._private() { print('#2'); }
   foo() {
     print('#3');
   }
}

principal.dart

import 'package:thing/thing.dart';

main() {
  print('#1');
  thing.foo();
}

Notez que le singleton n'est pas créées jusqu'à ce que le premier temps de la lecture est appelé en raison de la Dart initialisation.

Si vous préférez, vous pouvez également mettre en place des singletons comme statique de lecture sur la classe singleton. c'est à dire de la Chose.singleton, au lieu de un haut niveau de lecture.

Lire aussi Bob Nystrom de prendre sur les singletons de son Jeu de modèles de programmation livre.

31voto

Andrew Gerrand Points 686

Qu'en est-il de l'utilisation d'une variable globale dans votre bibliothèque, comme ceci?

single.dart :

 library singleton;

var Singleton = new Impl();

class Impl {
  int i;
}
 

main.dart :

 import 'single.dart';

void main() {
  var a = Singleton;
  var b = Singleton;
  a.i = 2;
  print(b.i);
}
 

Ou est-ce mal vu?

Le modèle singleton est nécessaire en Java, là où le concept de globals n'existe pas, mais il semble que vous ne devriez pas avoir à faire beaucoup de chemin dans Dart.

25voto

iBob101 Points 1

Voici un autre moyen possible:

 void main() {
  var s1 = Singleton.instance;
  s1.somedata = 123;
  var s2 = Singleton.instance;
  print(s2.somedata); // 123
  print(identical(s1, s2));  // true
  print(s1 == s2); // true
  //var s3 = new Singleton(); //produces a warning re missing default constructor and breaks on execution
}

class Singleton {
  static final Singleton _singleton = new Singleton._internal();
  Singleton._internal();
  static Singleton get instance => _singleton;
  var somedata;
}
 

15voto

Ticore Shih Points 51

Dart singleton par const constructeur & factory

 class Singleton {
  factory Singleton() =>
    const Singleton._internal_();
  const Singleton._internal_();
}


void main() {
  print(new Singleton() == new Singleton());
  print(identical(new Singleton() , new Singleton()));
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X