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 :

Méthode ne met pas à jour un objet


Sujet :

avec Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Méthode ne met pas à jour un objet
    Bonsoir à tous,

    Je débute en Java et en Orienté Objet et dans le cadre d'un projet j'ai besoin de mettre à jour la valeur d'un objet via une méthode static.

    Je poste ci-dessous un exemple similaire à mon coder pour expliquer plus facilement mon problème :

    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
    public class TestInteger {
    	private Integer i;
     
    	public TestInteger() {
    		i = new Integer(1);
    		System.out.println(i); // -> 1
    		setValue();
    		System.out.println(i); // -> 1
    	}
     
    public void setValue() {
    		IntegerLoader.loadInteger(i);
    	}
     
    public static void main(String[] args) {
    	new TestInteger();
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class IntegerLoader {
     
    	public static void loadInteger(Integer i) {
    		i = new Integer(2);
    	}
    }
    Mon problème est que je souhaite mettre à jour la valeur d'un objet (i, ici) via setValue() qui appelle une méthode static d'une autre classe.

    Or la valeur de i n'est que changée localement dans la méthode loadInteger() et dans mon véritable code, je n'ai pas la possibilité de faire de return.

    La seconde classe ne possédant pas de constructeur et n'étant pas destinée à en posséder un, je ne sais pas comment m'y prendre pour que la valeur de mon objet i soit bien mise à jour dans la classe appelante.


    Merci d'avance,
    Zedd.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java / JEE
    Inscrit en
    Février 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java / JEE

    Informations forums :
    Inscription : Février 2008
    Messages : 185
    Points : 293
    Points
    293
    Par défaut
    Bonjour,

    Tu ne peux pas faire de passage par référence d'un Integer en Java.
    Il te faudra changer ton approche...

    Mathieu

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'aimerais bien mais je ne vois pas comment ?

    J'ai impérativement besoin que cet objet soit instancié et mis à jour là où c'est fait et n'ai pas le droit à un return.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Java / JEE
    Inscrit en
    Février 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java / JEE

    Informations forums :
    Inscription : Février 2008
    Messages : 185
    Points : 293
    Points
    293
    Par défaut
    Si tu ne peux pas modifier la classe IntegerLoader tu n'as pas d'alternative...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je devrais faire quoi concrètement ?

    Lui ajouter un constructeur ?

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Java / JEE
    Inscrit en
    Février 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java / JEE

    Informations forums :
    Inscription : Février 2008
    Messages : 185
    Points : 293
    Points
    293
    Par défaut
    Ben si tu peux modifier cette classe autant mettre le "return" qui te manque
    Un constructeur n'y changera rien...

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut
    Bonsoir,

    Si tu ne peux pas faire un return dans la méthode loadInteger, peut être passer la valeur du int au travers d’un tableau. Ce n’est certainement la solution idéale, mais bon.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    En fait dans mon véritable projet, cette deuxième classe est chargée de lire un fichier txt qui représente une carte d'un niveau du jeu mario.

    Chaque donnée lue est ensuite stockée dans une HashMap sous forme d'un nouvel objet. Le problème est que j'ai besoin d'accéder à certains de ces objets mais pas tous, donc je souhaite les passer à cette classe pour qu'elle les insère dans la Hashmap tout en mettant à jour leur valeur..

    Le code en question (un peu élagué) :

    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
    public class MapLoader {
     
    	public static void loadMap(String filePath, Map<List<Integer>, Elements> map, Mario mario, List<Personages> list) throws IOException {
    		ArrayList<String> lines = new ArrayList<String>();
    		int width = 0;
    		int height = 0;
     
    		Scanner reader = new Scanner(new File(filePath));
    		while(reader.hasNextLine()) {
    			String line = reader.nextLine();
    			lines.add(line);
    			width = Math.max(width, line.length());
    		}
    		height = lines.size();
    		for (int y=0; y < height; y++) {
    			String line = lines.get(y);
    			for (int x=0; x < line.length(); x++) {
    				char ch = line.charAt(x);
    				if (ch == 'M') {
    					mario = new Mario(x, height-y-1);
    					map.put(Arrays.asList(x,height-y-1), mario);
    				}
    				if (ch == 'E') {
    					Enemies enemy = new Enemies(physics, x, height-y-1);
    					map.put(Arrays.asList(x,height-y-1), enemy);
    				}
    				if (ch == 'T') {
    					map.put(Arrays.asList(x,height-y-1), new Tiles(x,height-y-1));
    				}
    				if (ch == 'C') {
    					map.put(Arrays.asList(x,height-y-1), new Coins(x,height-y-1));
    				}
    			}
    		}	
    	}
    }
    L'objet que je voudrais récupérer tout en l'insérant dans la map est "mario" à la ligne 20.
    Je dois l'insérer dans la map à cet endroit car j'ai besoin de la valeur de x, y et height qui n'existent que dans cette classe :/

  9. #9
    Membre actif
    Homme Profil pro
    Développeur Java / JEE
    Inscrit en
    Février 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java / JEE

    Informations forums :
    Inscription : Février 2008
    Messages : 185
    Points : 293
    Points
    293
    Par défaut
    Ta méthode prend en paramètre "mario". Si tu n'en as qu'un seul alors à la sortie de ta méthode tu auras ce qu'il te faut, non ?

    Sinon vu que tu as ta map en paramètre, rien ne t’empêche de la reparcourir dans une autre classe.

    J'avoue que j'ai de la peine à comprendre ce que tu veux faire

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai aussi mon objet list à retourner^^

    Sinon oui je peux aller chercher ces éléments dans la map plus tard mais je pensais qu'il existait une solution pour simplement mettre la valeur à jour :/

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Bien sûr.

    Ajouter à ta méthode un paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void loadMap(String filePath, Map<List<Integer>, Elements> map, Mario mario, List<Personages> list, TrucQuiABesoinDeRecupererMario trucQuiABesoinDeRecupererMario)
    Et à l'intérieur, au bon endroit, appeler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trucQuiABesoinDeRecupererMario.setMario(mario);
    Une autre possibilité, serait de ne pas utiliser une Map directement.
    A la place, utiliser une classe qui contient une Map, mais aussi un accès direct au Mario de la Map. Ça évite de te traîner plusieurs choses qui contiennent tes données.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    Integer est une classe immuable. Une fois instancée tu ne peux lui réassigner de valeur. Si tu tiens à ton approche du 1er poste tu peux utiliser AtomicInteger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class IntegerLoader {
     
    	public static void loadInteger(AtomicInteger i) {
    		i.set(2);
    	}
    }

Discussions similaires

  1. [Débutant] Mise à jour du modèle ne met pas à jour les méthodes de fabrique
    Par sylvebarbe78 dans le forum Entity Framework
    Réponses: 2
    Dernier message: 11/03/2013, 18h35
  2. Mise à jour du modèle ne met pas à jour les méthode de fabrique
    Par killer_pingoui dans le forum Entity Framework
    Réponses: 2
    Dernier message: 15/01/2013, 15h56
  3. [AJAX] XMLHTTPREQUEST ne se met pas à jour :-/
    Par franckarts dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/08/2006, 18h11
  4. Update Récalcitrante !! Ne met pas à jour !
    Par samlepiratepaddy dans le forum Access
    Réponses: 14
    Dernier message: 28/10/2005, 09h31
  5. un update qui ne met pas à jour
    Par dor_boucle dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/10/2005, 09h31

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