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

Langage Java Discussion :

Modification d'un attribut static final


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut Modification d'un attribut static final
    Bonjour,
    j'ai une classe qui contient des méthodes "static" et dans cette classe, j'ai des attributs private static final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private final static List listeCriticite = Utils.loadListLVB("T_Criticite",
    			"t_criticite");
    La classe est utilisée car elle charge en mémoire les données d'une base de données pour éviter de faire à chaque fois des requêtes vers la base.
    J'ai une méthode qui récupère ces listes :
    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
    public static List getListFromRow(String row) {
    		List maListe = new ArrayList();
    
    		if (row.equals("criticite")) {
    			maListe = Utils.listeCriticite;
    		} else if (row.equals("orig_dem")) {
    			maListe = Utils.listeOrigDem;
    		} else if (row.equals("intervenant")) {
    			maListe = Utils.listeIntervenant;
    		} else if (row.equals("application")) {
    			maListe = Utils.listeApplication;
    		} else if (row.equals("etat")) {
    			maListe = Utils.listeEtat;
    		} else if (row.equals("tache")) {
    			maListe = Utils.listeTache;
    		} else if (row.equals("type_peri")) {
    			maListe = Utils.listeTypePeri;
    		} else if (row.equals("type_dem")) {
    			maListe = Utils.listetypeDem;
    		}
    		return maListe;
    	}
    J'appele ma méthode comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LabelValueBean lvb = new LabelValueBean("TOUS/TOUTES", "TOUS/TOUTES");
    listeAppli = Utils.getListFromRow("application");
    		listeAppli.add(0, lvb);
    Dans l'exemple si dans la liste j'ai initialment A, B et C après cet appel, j'ai TOUS/TOUTES, A B et C.
    Je ne sais pas si je me suis bien exprimé mais mon problème, pour résumer, est que la liste qui est en private final static est modifiée en dehors de la classe.
    Pourquoi ?

  2. #2
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Le mot clé static devant une variable (ou méthode) indique que celle-ci n'appartient pas à une instance particulière de la classe
    http://java.developpez.com/faq/java/...motsClesStatic

    En dehors de quelle classe ? De la classe qui fait la modif ? oui.

  3. #3
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Le mot clé final pour un attribut signifie que tu ne peux pas changer l'objet référencé ou la valeur de ton attribut. Mais rien ne t'interdit de changer l'état de ton objet.

    A+

  4. #4
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    En fait personne ne fait de modif.
    La seule chose qui me parait louche c'est celle-ci :

    listeAppli = Utils.getListFromRow("application");
    // ici je récupère la liste et normalement, elle est recopiée vers une autre liste (listeAppli)

    listeAppli.add(0, lvb);
    // j'ajoute un élément à la liste "listeAppli", et du coup dans l'attribut static, cette valeur est aussi ajoutée. Alors qu'elle ne devrait pas.

  5. #5
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Citation Envoyé par n@n¤u
    listeAppli = Utils.getListFromRow("application");
    // ici je récupère la liste et normalement, elle est recopiée vers une autre liste (listeAppli)
    FAUX !
    En java, tout est référence (a part les type primitifs qui fonctionnent différemment). Donc cette ligne de code permet de récupérer une référence sur l'objet cité. Donc ce que tu manipule ensuite, via cette référence, est l'objet initial.

  6. #6
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Ah oui ! C'est vrai, j'ai complétement oublié.
    Y'a-t-il un moyen de faire une copie de la liste simplement ?

    Plutot que de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    listeAppli = Utils.getListFromRow("application");
    		List listeAppliBis = new ArrayList();
    		for (int i = 0; i < listeAppli.size(); i++) {
    			listeAppliBis.add(listeAppli.get(i));
    		}
    		listeAppliBis.add(0, lvb);

  7. #7
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    listeAppli = Utils.getListFromRow("application");
    List listeAppliBis = new ArrayList();
    listeAppliBis .addAll(listeAppli);
    listeAppliBis.add(0, lvb);

  8. #8
    Membre averti Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Points : 328
    Points
    328
    Par défaut
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ArrayList listeAppliBis = new ArrayList(listeAppli);
    listeAppliBis.add(0, lvb);
    ?

  9. #9
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Ca marche du tonnerre.
    Bravo à vous !

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

Discussions similaires

  1. Attributs static d'une classe
    Par Edouard Kaiser dans le forum C++
    Réponses: 15
    Dernier message: 04/04/2006, 00h17
  2. Réponses: 3
    Dernier message: 13/12/2005, 09h52
  3. Extension de déclaration d'un attribut static...
    Par SteelBox dans le forum C++
    Réponses: 7
    Dernier message: 15/02/2005, 20h23
  4. Attributs static
    Par poinclin dans le forum Langage
    Réponses: 4
    Dernier message: 18/06/2004, 14h57
  5. Réponses: 8
    Dernier message: 28/04/2004, 16h53

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