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

avec Java Discussion :

Comment récupéré une variable qui est dans une autre classe


Sujet :

avec Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut Comment récupéré une variable qui est dans une autre classe
    Bonjour,

    Je rencontre un problème pour faire remonter ma variable jusqu'au main.
    Mon problème se situe dans le fichier Menu.java dans la méthode public int choixPerso()

    Pour que cela soit plus compréhensible voici un code :

    Fichier App.java qui contient le main.

    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
     
    package test;
     
    public class App 
    {
        public static void main( String[] args )
        {
            Menu menu = new Menu();
            Game game = new Game();
     
            int nMenuVal = 0;
            boolean nLoop = true;
     
            while(nLoop)
            {
                switch(nMenuVal)
                {
                    case 0:
                        nMenuVal = menu.welcome(); //Permet de choisir de créer : son perso, jouer ou de quitter.
                        break;
                    case 1:
                        nMenuVal = menu.choixPerso(); //Permet de donner un nom à son perso.
                        break;    
                    case 2:
                        game.game(); //De jouer.
                        nMenuVal = 0;
                        break;
                    case 3:
                        default:
                            nLoop = false;
                }
            }
        }
    }
    Le fichier Menu.java

    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
     
    package test;
     
    import java.util.Scanner;
     
    public class Menu{
     
        private String sChoice;//Récupération de la chaine de caractère entré par l'utilisateur.
        private int nChoice; //Choix de l'utilisateur après conversion de String en int.
        private boolean bLoop;
     
        Scanner scan = new Scanner(System.in);
     
        public Menu(){
            sChoice = "";
            nChoice = -1;
            bLoop = true; 
        }
     
    //Récupère le nom rentré par l'utilisateur.
        public String nameGamer(){
            sChoice = scan.nextLine();
            return sChoice;
        }
     
    //Accueil demandant de donner un nom à son perso.
        public int choixPerso(){
     
            String sNameGamer;
            System.out.println(" Donne un nom a ton personnage : ");
     
            sNameGamer = nameGamer();//MON PROBLEME SE SITUE ICI :comment faire pour renvoyer sNameGamer dans le main ?
     
            System.out.println("Nom du perso " + sNameGamer + ".\n");
     
            return 0;
        }
     
    //Le menu.
        public int welcome(){
     
            System.out.println("/******** Bienvenue dans WARRIOR GAMER ********/");
     
            do{    
                System.out.println(" - 1 - Creer son personnage.");
                System.out.println(" - 2 - Game.");
                System.out.println(" - 3 - Quitter.");
     
                sChoice = scan.nextLine();
                if(Exceptions.isInteger(sChoice)){
                    nChoice = Integer.parseInt(sChoice);
                    bLoop = Tools.isChoiceValidInt(nChoice, 1, 3);
                }
                else
                    bLoop = true;
            }while(bLoop);
            return nChoice;
        }
    }
    Le fichier Perso.java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    package test;
     
    public class Perso{
        private String sName;
     
        public void setName(String s_Name){
            sName = s_Name;
        }
     
        public String toString(){
            return "Mon nom est : " + sName + ".";
        }
    }
    Pendant que j'y suis : si dans une class je dois utiliser dans plusieurs méthode l'objet Scanner est-ce que je peut instancier la class Scanner comme un attribut comme j'ai fait dans le Menu.java ou bien dois-je l'instancier dans chaque méthode ?

  2. #2
    Membre du Club
    Homme Profil pro
    Chercheur d'Emploi
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'Emploi

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Points : 65
    Points
    65
    Par défaut
    Tu dois créer une méthode dans ta classe menu, méthode qu'on appelle un Getter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String getSChoice() {
     return this.sChoice;
    }
    et dans ta classe main:

    (Une manière de faire encore plus rapide est tout simplement Menu.sChoice (avec le M en majuscule, il ne sagit pas ici de l'objet que tu as crée dans la classe Main) mais ça peut vite foutre le bordel d'utiliser directement les variables de la classe plutot que celle de l'objet crée donc conventionnellement on doit créer des Getters et/ou des Setters pour manipuler les variables d'autres classes)

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par hbx360 Voir le message
    Pendant que j'y suis : si dans une class je dois utiliser dans plusieurs méthode l'objet Scanner est-ce que je peut instancier la class Scanner comme un attribut comme j'ai fait dans le Menu.java ou bien dois-je l'instancier dans chaque méthode ?
    Il faut éviter de créer plusieurs instances de Scanner sur System.in parce que cette classe est bufferisée : lorsqu'on lit par exemple un int (avec nextInt()), des caractères vont être lus en avance pour déterminer la fin du int dans le buffer. La lecture par une autre instance de Scanner va donc être incorrecte.

    Solutions possibles (mono thread):
    1. Créer une instance et la passer en argument de la construction des classes
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      public class Machin {
          private Scanner input;
          public Machin(Scanner input) {
                  this.input=input;
          }
           public void methodeQuiLit() {
                  int valeur = input.nextInt();
           }
      }
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public class Truc {
          private Scanner input;
          public Truc(Scanner input) {
                  this.input=input;
          }
      }
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      public class Programme {
           public static void main(String[] args) {
              Scanner scanner = new Scanner(System.in);
              Machin machin = new Machin(scanner);
              Truc truc = new Truc(scanner);
           }
      }
    2. Utiliser un singleton, avec accès static :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      public class Programme {
       
           public static Scanner INPUT = new Scanner(System.in);
       
           public static void main(String[] args) {
              Machin machin = new Machin();
              Truc truc = new Truc();
           }
      }
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      public class Machin {
          public Machin() {
          }
           public void methodeQuiLit() {
                  int valeur = Programme.INPUT.nextInt();
           }
      }
    3. Faire une classe utilitaire pour lire au clavier :
      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
      public class Clavier {
       
           private static Scanner INPUT = new Scanner(System.in);
       
           public static int lireInt(String question) {
                  System.out.print(question);
                  while(INPUT.hasNext()) {
                        if ( INPUT.hasNextInt() ) {
                             int valeur = INPUT.nextInt();
                             INPUT.nextLine(); // vide le buffer jusqu'au prochain retour chariot
                             return valeur;
                        } 
                        System.out.println("Vous devez saisir un nombre.  Recommencez s'il vous plait.");
                        System.out.print(question);
                  }
           }
       
           public static int lireInt(String question, int min, int max) {
                /*...*/
           }
       
       
           public static String lireString(String question) {
                /*...*/
           }
       
      }
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      public class Programme {
       
       
           public static void main(String[] args) {
              Machin machin = new Machin();
              Truc truc = new Truc();
              machin.methodeQuiLit();
           }
      }
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      public class Machin {
          public Machin() {
          }
           public void methodeQuiLit() {
                  int valeur = Clavier.lireInt("Veuillez saisir machin...");
           }
      }
      Cette dernière version présente l'avantage de pouvoir décorer la lecture de différents traitements (affichage d'un prompt, traiterment d'erreur de saisie, etc) qu'on peut réutiliser partout. En multi-thread on pourrait ajouter des synchronized sur les méthodes pour éviter des lectures et affichages mélangés.
    4. ...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par CoDuSu Voir le message
    (Une manière de faire encore plus rapide est tout simplement Menu.sChoice (avec le M en majuscule, il ne sagit pas ici de l'objet que tu as crée dans la classe Main)
    Attention, Menu.sChoice implique que sChoice est static :
    • mauvais si plusieurs instances de Menu, parce que même valeur partagée entre toutes les instances
    • mauvais si une seule instance de Menu parce que des méthodes non static vont manipuler une variable static : autant faire toutes les méthodes static et ne plus faire de new (voire interdire la possiblité de faire new pour éviter des soucis)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Solutions possibles (mono thread):
    on peut même pousser le bouchon très loin avec des interfaces définissant des services:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface AgentSaisie {
        // ou autres
        public String saisie() ;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface AgentAffichage {
       public void invite( String invite) ;
      public void affichage(String résultat) ;
      public void incident(String messageErreur) ;
    }
    ok c'est plus tordu (et dépasse le niveau débutant) mais ça donne l'habitude de découpler "métier" et interactions.
    (le même code pourra être utilisé avec des interactions console, des scripts de test ou des interfaces graphiques)
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    Merci beaucoup pour vos réponses.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    @joel.drigo Donc j'ai fait une class Keyboard pour ouvrir qu'une instance Scanner mais dans ton exemple tu n'utilise pas la méthode close() pour fermer System.in je voulais savoir si c'est obligatoire ou optionnel et ou dois-je la mettre.

    Merci par avance.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La règle : fermer les flux qu'on a ouvert. System.in est géré par Java, pas besoin de le fermer.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    Ok merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/03/2007, 09h03
  2. Réponses: 31
    Dernier message: 06/07/2006, 14h35
  3. Réponses: 2
    Dernier message: 28/06/2006, 08h53

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