Bonjour,
Je pense que j'ai un problème concernant l'implémentation du singleton. Pour le mettre clairement en évidence j'ai fait un petit code tout simple.
Voici la classe qui doit être un singleton :
Voici la classe qui l'utilise :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Toto { private static Toto MONTOTO = null; private List<String> maliste; public Toto() { super(); maliste = new ArrayList<String>(); } public synchronized static Toto getSingleton(){ if(MONTOTO == null){ MONTOTO = new Toto(); } return MONTOTO; } public void populateList(){ maliste.add("avion"); maliste.add("bateau"); maliste.add("voiture"); maliste.add("train"); System.out.println("pause"); } public void readList(){ for (Iterator<String> iterator = maliste.iterator(); iterator.hasNext();) { String current = (String) iterator.next(); System.out.println(" ----- " + current + " ----- "); } } }
et enfin voici la classe de test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public class Tata { public static void populateData(){ Toto.getSingleton().populateList(); } public static void readData(){ Toto.getSingleton().readList(); } }
Je mets 2 points d'arrêts dans la classe du singleton, un au début de la méthode getSingleton et l'autre au niveau du System.out.println("pause");.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import junit.framework.TestCase; public class Test extends TestCase{ public final void testPopulateData() { Tata.populateData(); } public final void testReadData() { Tata.readData(); } }
Je commence par lancer mon test testPopulateData, il s'arrête dans la méthode getSingleton, comme c'est le premier appel il va le créer. Je continue l'execution il s'arrête au System.out.println("pause"). Je le laisse la a l'arrêt et je lance testReadData (création donc d'un nouveau thread), il s'arrête bien au début de la méthode getSingleton, seulement il me dit que MONTOTO est égal a null alors que je viens juste de le créer au dessus (et que quand je reviens au premier thread je vois bien sa valeur).
Je ne comprends pas pourquoi j'ai ce résultat, et ce que je dois modifier pour que mon singleton marche bien.
Merci![]()
Partager