IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[Conception] Accès multiples à une même instance


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut [Conception] Accès multiples à une même instance
    Salut a tous et toutes,


    Je me mets au Java depuis à peu près 2 mois et me retrouve bloqué face à un problème lié, je suppose, aux instances et methodes d'acces/modification de champs(set/get).


    Voici les elements du probleme :

    - développement d'un jeu
    - une instance de la classe NouvellePartie doit s'initialiser en fonction de choix saisis par l'utilisateur dans des menus d'options (une instance de la classe Options, puis une instance de la classe TypeJoueur (--> ordinateur ou humain) par exemple)
    - Menu
    |__ NouvellePartie
    |__ Options (--> on instancie TypeJoueur et NombreJoueur dans l'instance de Options, elle-meme instanciée dans l'instance de Menu)
    ....|__ TypeJoueur
    ....|__ NombreJoueur
    - l'instance de NouvellePartie va chercher les valeurs par défaut des champs de TypeJoueur, a l'aide d'accesseurs


    Le probleme :

    --> 1 - l'instance de TypeJoueur est créée dans l'instance de Options.
    2 - les champs de cette instance reçoivent alors les valeurs saisies par l'utilisateur
    3 - l'instance de NouvellePartie realise une nouvelle allocation memoire/instance de TypeJoueur, afin de pouvoir appeler les methodes d'acces (TypeJoueur joueur1 = new TypeJoueur(); joueur1.getTypeJoueur1();
    4 - il y a alors 2 instances de TypeJoueur, et les valeurs des champs de la 2nde sont celles par defaut, et non plus celles definies par l'utilisateur dans la 1ere instance


    La question (est-ce la bonne ?) :

    --> comment utiliser une meme instance d'une classe, dans plusieurs differentes instances d'autres classes ?


    Merci d'avance et bien la bonne fete pour vendredi soir (^o^Y^o^)

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 76
    Points : 88
    Points
    88
    Par défaut pas tout compris...
    j ai pas tout compris mais a première vu le pattern Singleton pourrait te sauver
    Waddle

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut
    Salut waddle, et merci pour ta rapidité ;o)

    Je viens de chercher un peu au sujet du "pattern Singleton" et --> " Classe dont on veut s'assurer qu'il n'existera qu'une et une seule instance dans l'espace et dans le temps d'un bout à l'autre du cycle de vie de l'application."

    Ca n'a pas l'air de coller a mon probleme. Par exemple, la classe TypeJoueur aura 2 instances (joueur1 et joueur2). Par contre, je souhaite pouvoir accéder aux champs de chacune de ces instances, depuis n'importe quelle classe/instance du programme.

    Pour le moment, le souci est que lorsque je veux utiliser les accesseurs de la classe TypeJoueur, je dois initialiser une nouvelle instance de TypeJoueur dans chaque fichier/classe. Ainsi, les champs des instances de TypeJoueur retrouvent a chaque fois les valeurs par défaut definies dans le constructeur, et non pas "les valeurs saisies par l'utilisateur".

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 76
    Points : 88
    Points
    88
    Par défaut dans ce cas
    dans ce cas adapte le singleton en l'encapsulant dans une classe en contenant deux instances.

    classiquement l unique instance d un singleton s obtient avec getInstance() (ou u truc du genre), adpate ca en getInstance(qquechosequideterminelepremierouledeuxiemejoueur).

    maintenant avant de tester si l instance existe deja dans getInstance tu effectue le test sur le parametre pour voir qu elle instance t es demande de verifier et de renvoyer
    Waddle

  5. #5
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    G moi aussi pas tout saisi, mais bon tu peux avoir ta classe

    et dans les autres classes une référence static à la classe précédente initialisée une fois lors du chargement de ces classes via un initialisateur staique apr exemple...

    Je c pa si c clèr...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut
    Si si ! C'est bien clair.

    Je suis vos pistes et vous tiens au courant. Pour l'heure, let's go to work !

  7. #7
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Ceci dit ce ke j'ai dit précédemment revient a faire un singleton ...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut
    waddle, thibaut, merci beaucoup ;o)

    Je me suis plongé dans les cours sur le modificateur static et les singletons, et c'est le panard ! Il y a encore 24h, je croyais pas qu'on pouvait utiliser une methode de classe sans devoir au prealable l'instancier ^^

    Si le singleton etait un alcool, j'en boirais des litres entiers demain soir tiens !

    Apres avoir corrigé des histoires "non-static variable from a static context", il reste un cratère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Tab {	
     
    	private String natureJoueur1;
    	private String natureJoueur2;
     
    	private int NBTAS = 3;
    	private int NBBITS = 5;
    	private int tab[][] = new int [4][6];
    	private Random r = new Random();
     
    	ModeDeJeu modeDeJeu = ModeDeJeu.getInstance();
    	natureJoueur1 = modeDeJeu.getNatureJoueur1();
    	natureJoueur2 = modeDeJeu.getNatureJoueur2();
    Les 2 dernieres lignes (avec naturejoueur1 et naturejoueur2) renvoient "identifier expected" alors que ces 2 variables sont declarees comme des String qqs lignes au-dessus.

    Lorsque je leur remets le String, elles disent "already defined".

    Je comprends pas ..

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut
    Bon ben ca s'arrange pas en fait. En remettant le type String devant les 2 lignes ci-dessus, le compilateur dit qu'il ne connait pas la methode getInstance().

    Voila donc le code des classes "ModeDeJeu" (dans la quelle est defini le singleton) et "UtilTab" (qui permet de creer des parties de jeu) :


    Class ModeDeJeu
    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
    import java.io.*;
     
     
     
    public class ModeDeJeu	{
     
     
    	public String natureJoueur1;
    	public String natureJoueur2;
     
    	private static ModeDeJeu instance;
     
        public static ModeDeJeu getInstance()  {
              if (  instance == null ) {
                    instance = new ModeDeJeu();
              }
              return instance;
        }
     
     
     
     
     
    	private ModeDeJeu()  {
    		natureJoueur1="ordinateur aleatoire";
    		natureJoueur2="ordinateur strategique";	
    	}
    ....

    Class UtilTab
    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
    class UtilTab {
     
    	String natureJoueur1;
    	String natureJoueur2;
     
    	private static UtilTab instance;
     
        public static UtilTab getInstance()  {
              if (  instance == null ) {
                    instance = new UtilTab();
              }
              return instance;
        }
     
    	private UtilTab()  {
    	}
     
    	ModeDeJeu modeDeJeu = ModeDeJeu.getInstance();
    	natureJoueur1 = modeDeJeu.getNatureJoueur1();
    	natureJoueur2 = modeDeJeu.getNatureJoueur2();
    ....
    Je continue a chercher.

  10. #10
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    2 solutions:

    soit tu initialise tes 2 String dans le constructeur, soit dès leur déclaration
    n°1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private ModeDeJeu modeDeJeu = ModeDeJeu.getInstance(); 
    private String natureJoueur1;
    private String natureJoueur2; 
     
    // Constructeur
    MaClasse(){
      natureJoueur1 = modeDeJeu.getNatureJoueur1();
      natureJoueur2 = modeDeJeu.getNatureJoueur2(); 
    }

    n°2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private ModeDeJeu modeDeJeu = ModeDeJeu.getInstance(); 
    private String natureJoueur1 = modeDeJeu.getNatureJoueur1();
    private String natureJoueur2 = modeDeJeu.getNatureJoueur2();
    mais tu ne peux pas écrire du code n'importe où dans la classe, il faut le mettre dans une méthode ou alors en faire une déclaration de champ

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 76
    Points : 88
    Points
    88
    Par défaut attention
    attention a l usage abusif du singleton
    Com l a dit notre ami Thibaut dans un ancien post de ce forum (Thibaut si tu pouvais remettre le lien ca sera sympa je pense ;-) ) tres instructif le singleton n est pas thread-safe (ce qui est connu) mais le double verrou non plus (ce qui l est moins).
    Waddle

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut
    Tu entends par "thread-safe" les collisions, accès concurrents à linstance unique ? Ce probleme se resoud par l'ajout du modificateur "synchronized" dans la declaration de la methode getInstance() non ?

    Sinon le singleton marche bien, il transmet les bonnes valeurs aux objets qui l'utilisent.

    Il s'agit en fait de passer à une nouvelle partie des variables définies dans une classe ModeDeJeu (type des joueurs : ordinateur aleatoire, ordinateur strategique, humain).

    Lorsque je ne definis aucune option, les valeurs par defaut du constructeur de ModeDeJeu sont utilisees (aleatoire vs humain).

    Quand je definis d'autres types de joueurs et que je lance une partie : boucle infinie. Les types de joueurs definis apparaissent bien quand je teste un affichage, donc les valeurs sont bien transmises , mais ces valeurs doivent definir d'autres actions (exemple : si humain, invite de saisie)

    Vu que j'ai peut-etre quand meme foiré le code du singleton, voici le code des classes incriminées :



    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    import java.io.*;
     
     
     
    public class ModeDeJeu	{
     
     
    	[b]private static ModeDeJeu instance;
    	private String natureJoueur1;
    	private String natureJoueur2;
     
    	public static synchronized ModeDeJeu getInstance()  {  //methode du Design Pattern - Singleton
              if (instance == null) {
                    instance = new ModeDeJeu();
              }
              return instance;
        }
     
       private ModeDeJeu()  {
          natureJoueur1="Ordinateur aleatoire # 1";
          natureJoueur2="Ordinateur strategique # 2";   
       } [/b]
     
     
    	public void selectionModeDeJeu()  {
    		Outils outils = new Outils();
    		outils.effacementEcran();  //emule un clear screen
     
    		try {
    			System.out.print("###"+natureJoueur1+"###"+natureJoueur2+"###");
    			InputStreamReader lecteur = new InputStreamReader(System.in);
        		BufferedReader entree = new BufferedReader(lecteur);
        		System.out.print("\n  A   -->   Ordinateur aleatoire  \n  S   -->   Ordinateur strategique  \n  H   -->   Humain\n\n\n"); 
        		System.out.print("Merci d'entrer la nature du joueur 1 (A/S/H) :  ");
        		String natureJoueur1Saisie = entree.readLine();
        		char natureJr1 = natureJoueur1Saisie.charAt(0);
        		System.out.print("\nMerci d'entrer la nature du joueur 2 (A/S/H) :  ");
        		String natureJoueur2Saisie = entree.readLine();
        		char natureJr2 = natureJoueur2Saisie.charAt(0);
        		[[b]b]natureJoueur1 = determineNatureJoueur(natureJr1)+" # 1";[/b]
        		natureJoueur2 = determineNatureJoueur(natureJr2)+" # 2";[/b]
       			System.out.print("\n\n    Pressez la touche 0 pour revenir au menu precedent :  ");
       			String validationSaisie = entree.readLine();
       			Integer.parseInt(validationSaisie);
       			Options options=new Options();
        		options.selectionneOption();
    		}
    		catch (Exception e) {
    			System.out.println("Erreur de saisie.");	
    		}
     
    	}	
     
    	public String determineNatureJoueur(char nj)  {
    			String natureJoueur;
    			if (nj=='A') {
    				natureJoueur="Ordinateur aleatoire";
    			}
    			else {
    				if (nj=='S') {
    					natureJoueur="Ordinateur strategique";
    				}
    				else {
    					natureJoueur="Humain";
    				}	
    			}
    			return(natureJoueur);
    	}
     
    	public String getNatureJoueur1()  {
    		return(natureJoueur1);	
    	}
     
    	public String getNatureJoueur2()  {
    		return(natureJoueur2);	
    	}
     
     
    }
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    import java.util.Random;
    import java.io.*;
     
     
     
    class Tab {	
     
     
    	private int NBTAS;
    	private int NBBITS;
    	private int tab[][];
    	private Random r;
     
    	public Tab() {  //Constructeur
    		NBTAS = 3;
    		NBBITS = 5;
    		tab = new int [4][6];
    		r = new Random();
    		int compt=0;
    		for (int i=0;i<NBTAS;i++){
    			for (int j=0;j<5;j++){
    				tab[i][j]= r.nextInt(2);
    				if (tab[i][j]==0){//Condition de verification qu'un tas ne contienne pas 0 elements
    					compt=compt+1;
    				}
    			}
    			if (compt==5){
    				i--;
    			}
    			compt=0;
    		}
    		ConvertDecimal();
    		Somme();
    		System.out.println("------ Situation de depart ------\n");
    		Affichage();
     
    		try {
    			InputStreamReader lecteur=new InputStreamReader(System.in);
            	BufferedReader entree=new BufferedReader(lecteur);
     
            	String attente=entree.readLine();
            	}
     
            catch (Exception e) {
            	System.out.println("Erreur de saisie.");
            }
    	}
     
    	public void Affichage() {
    		String res="";
    		for (int i=0;i<NBTAS;i++) {
    			for (int j=0;j<NBBITS;j++) {
    				res=res+" "+tab[i][j];
    			}
    			res=res+" | "+tab[i][NBBITS]+"\n";
    		}
    		for (int j=0;j<NBBITS;j++) {
    			res=res+"==";
    		}
    		res=res+"=====\n";
    		for (int j=0;j<NBBITS;j++) {
    			res=res+" "+tab[NBTAS][j];
    		}
    		res=res+" | "+tab[NBTAS][NBBITS];
    		System.out.println(res);
    	}
     
    	public void Somme(){
    		int somme=0;
    		for (int j=0;j<NBBITS+1;j++){
    			for (int i=0;i<NBTAS;i++){
    				somme=somme+tab[i][j];
    				tab[NBTAS][j]=somme;
    			}
    			somme=0;
    		}
    	}
     
    	public void StrategieGagnante(){
    		int tas=0;
    		int colonne=-1;
    		//Detecte si il y a une case a 1 dans la somme des tas. Si ce n'est pas le cas, collonne vaut -1
    		for (int j=0;j<NBBITS;j++){
    			if (tab[NBTAS][j]==1){
    				colonne=j;
    				break;
    			}
    		}
    		//Detecte si il y a une case a 3 dans la somme des tas. Si ce n'est pas le cas, collonne vaut -1
    		if (colonne==-1){
    			for (int j=0;j<NBBITS;j++){
    				if (tab[NBTAS][j]==3){
    					colonne=j;
    					break;
    				}
    			}
    		}
    		if (colonne!=-1){//Si on a detecté au moins un 1 ou au moins un 3
    			for (int k=0;k<NBTAS;k++){
    				if (tab[k][colonne]==1){
    					tas=k;
    					break;
    				}
     
    			}
    			int numTas=tas+1;
     
    			for (int i=0;i<NBBITS;i++){
    				if ((tab[NBTAS][i]!=2) && (tab[NBTAS][i]!=0)){
    					if (tab[tas][i]==1){
    						tab[tas][i]=0;
    					}
    					else{
    						tab[tas][i]=1;
    					}
    				}
    			}
    			int nbAvant=tab[tas][NBBITS];
    			ConvertDecimal();
    			int nbApres=tab[tas][NBBITS];
    			int nb=nbAvant-nbApres;
    			Somme();
    			Affichage();
     
    			System.out.println("  --> retrait de "+nb+" elements dans le tas numero "+numTas);
     
    			try {
    			InputStreamReader lecteur=new InputStreamReader(System.in);
            	BufferedReader entree=new BufferedReader(lecteur);
     
            	String attente=entree.readLine();
            	}
     
            	catch (Exception e) {
            	System.out.println("Erreur de saisie.");
            	}
    		}
    		else{//Correspond au cas ou on est deja en situation perdante
    			StrategieAleatoire();
    		}
    	}
     
    	public void StrategieAleatoire(){
    		int ligne=0;
    		int nb=0;
    		ligne=r.nextInt(NBTAS);
    		while (tab[ligne][NBBITS]==0) {
    			ligne=r.nextInt(NBTAS);
    		}
    		nb=tab[ligne][NBBITS];
    		int tas=ligne+1;
    		int nbAvant=tab[ligne][NBBITS];
    		tab[ligne][NBBITS]=r.nextInt(nb);
    		int nbApres=tab[ligne][NBBITS];
    		nb=tab[ligne][NBBITS];
    		ConvertBin(ligne,nb);
    		nb=nbAvant-nbApres;
    		Somme();
    		Affichage();
     
    		System.out.println("  --> retrait de "+nb+" elements dans le tas numero "+tas);
     
    		try {
    			InputStreamReader lecteur=new InputStreamReader(System.in);
            	BufferedReader entree=new BufferedReader(lecteur);
     
            	String attente=entree.readLine();
            }
     
            catch (Exception e) {
            	System.out.println("Erreur de saisie.");
            }
    	}
     
    	public void ConvertDecimal(){
    		int res=0;
    		int k=16;
    		for (int i=0;i<NBTAS;i++){
    			for (int j=0;j<NBBITS;j++){
    				res=res+k*tab[i][j];
    				k=k/2;
    			}
    			tab[i][NBBITS]=res;
    			res=0;
    			k=16;
    		}
    	}
     
    	public void ConvertBin(int ligne, int nb){
    		int res=0;
    		int k=16;
    		for (int j=0;j<NBBITS;j++){
    			tab[ligne][j]=nb/k;
    			nb=nb%k;
    			k=k/2;
    		}
    	}
     
    	public int getSomme(){
    		return tab[NBTAS][NBBITS];
    	}
     
    	public void saisieLecture() {
     
    		try {
    			InputStreamReader lecteur=new InputStreamReader(System.in);
            	BufferedReader entree=new BufferedReader(lecteur);
     
            	System.out.print("Dans quel tas souhaitez-vous retirer ?  ");
            	String ligneString=entree.readLine();
           		int ligne=Integer.parseInt(ligneString);
     
           		System.out.print("Combien d'elements souhaitez-vous retirer dans le tas ?  ");
            	String nbString=entree.readLine();
            	int nb=Integer.parseInt(nbString);
            	System.out.println();
            	int nbAvant=tab[ligne-1][NBBITS];
            	int nbElem=nbAvant-nb;
            	ConvertBin(ligne-1,nbElem);
            	ConvertDecimal();
            	Somme();
            	Affichage();
     
            	System.out.println("  --> retrait de "+nb+" elements dans le tas numero "+ligne+".");
     
            	String attente=entree.readLine();
            }
     
            catch (Exception e) {
            	System.out.println("Erreur de saisie.");
            }
     
    	}
     
    	[b][b]public void retraitElements(String nj)  {
    		String natureJoueur = nj;
    		if (natureJoueur=="Ordinateur aleatoire # 1" || natureJoueur=="Ordinateur aleatoire # 2") {
    			StrategieAleatoire();	
    		}
    		if (natureJoueur=="Ordinateur strategique # 1" || natureJoueur=="Ordinateur strategique # 2") {
    			StrategieGagnante();	
    		}
    		if (natureJoueur=="Humain # 1" || natureJoueur=="Humain # 2") {
    			saisieLecture();	
    		}
    	}[/b][/b]
     
     
     
    }
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    import java.util.Random;
    import java.io.*;
     
     
     
     
    class UtilTab {
     
    	private ModeDeJeu modeDeJeu = ModeDeJeu.getInstance();
    	private String natureJoueur1 = modeDeJeu.getNatureJoueur1();
    	private String natureJoueur2 = modeDeJeu.getNatureJoueur2(); 
     
    	public void jeu() {
    		Outils outils = new Outils();
    		outils.effacementEcran();  //emule un clear screen
    		Tab nim = new Tab();	
    		String tourJoueur = natureJoueur1;
    		while (nim.getSomme()!=0) {
    			if (tourJoueur==natureJoueur1) {
    				System.out.println();
    				System.out.println("\n---  Joueur \""+natureJoueur1+"\"  ---\n");
    				[b][b]nim.retraitElements(natureJoueur1)[/b][/b];
    				tourJoueur=natureJoueur2;
    				System.out.println();				}
    			else {
    				System.out.println("\n---  Joueur \""+natureJoueur2+"\"  ---\n");
    				nim.retraitElements(natureJoueur2);
    				tourJoueur=natureJoueur1;
    			}
    		}
    		if (tourJoueur==natureJoueur1) {
    			System.out.println("Le Joueur \""+natureJoueur2+"\" a gagne.");
    		}
    		else {
    			System.out.println("Le Joueur \""+natureJoueur2+"\" a gagne.");
    		}
     
    		try {
    			InputStreamReader lecteur = new InputStreamReader(System.in);
        		BufferedReader entree = new BufferedReader(lecteur);
        		System.out.print("\n\n Une autre partie (O/N) ?  ");
        		String autrePartieSaisie = entree.readLine();
        		char autrePartie = autrePartieSaisie.charAt(0);
        		if (autrePartie=='O') {
        			UtilTab nouvellePartie=new UtilTab();
        			nouvellePartie.jeu();	
        		}
        		else {
       				System.out.print("\n\n    Pressez la touche 0 pour revenir au menu principal :  ");
       				String validationSaisie = entree.readLine();
       				Integer.parseInt(validationSaisie);
        			Menu menu=new Menu();
        			menu.selectionneMenu();
    			}
    		}
    		catch (Exception e) {
    			System.out.println("Erreur de saisie.");	
    		}
     
    	}
     
     
    }
    [/b]



    Desolé, j'ai pas réussi à mettre les lignes importantes en gras, dans le code.

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 76
    Points : 88
    Points
    88
    Par défaut oui c ca
    oui c ce que j entend par thread-safe mais ce que tu suggere n est pas bon en termes de perf car tu synchronize toute la methode !!!!
    J'attends que Thibaut reposte son lien si benefique et tu comprendra tout
    Waddle

  14. #14
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    Je n'ai pas trouvé le lien exact de Thibaut, mais celui ci donne une idée :
    http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

    Pour plus de lien "double check locking" dans google....

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut
    Merci pour les liens, je vais m'informer un peu là, car je comprends pas bien en quoi le fait de "synchroniser toute la methode" est genant.

    Que element faudrait-il synchroniser selon toi ? Juste le constructeur Singleton() ?

    Je comprends mal. ^^ hopopop ! je vais lire.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut
    En potassant ce lien tout s'explqiue : http://www-106.ibm.com/developerwork...ary/j-dcl.html

    you pay the cost of synchronization for every invocation of the method, even though it is only required on the first invocation
    Donc tu voulais dire que "tous les appels" de la methode sont synchronises, lorsque seul le 1er appel (celui qui crée l'instance unique) devrait l'etre, our eviter d'avoir alors 2 instances ?

    Le risque qu' "un acces concurrent, lors du 1er appel de la methode, fait naitre 2 instances" me parait peu probable. Mais comme dit Bigard, "Admettons !", que se passerait-il si l'on avait 2 instances de notre classe Singleton ? Quelle instance verrait ses valeurs modifiees lors de traitements depuis d'autres classes ?

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Points : 77
    Points
    77
    Par défaut
    Ca y est, j'ai lu les liens, et n'est pas vraiment tout compris aux histoires de "ou-of-order" (je débute le développement depuis 3 mois).

    Il n'y a pas l'air d'y avoir de rustine "universelle" (pour toutes machines, tous processeurs) pour faire fonctionner le "double-checked locking", et la synchronisation ne semble pas prendre un poids si énorme.

    Pour la synchro hip hip hip ! Je la garde

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Référence multiple à une même note de bas de page
    Par Alqualonde dans le forum Word
    Réponses: 8
    Dernier message: 23/04/2018, 21h24
  2. Accès multiple à une base ACCESS sous B6
    Par grateurs dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/01/2009, 22h03
  3. Réponses: 4
    Dernier message: 07/10/2008, 12h17
  4. Concurrence d'accès sur une même donnée
    Par freelancer dans le forum Langage
    Réponses: 1
    Dernier message: 17/05/2006, 18h13
  5. Acces multiple à une BD Interbase ou Firebird
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 7
    Dernier message: 27/10/2005, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo