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

Collection et Stream Java Discussion :

Protection d'un tableau public static final


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Développeur Back-End
    Inscrit en
    Mars 2005
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mars 2005
    Messages : 31
    Points : 46
    Points
    46
    Par défaut Protection d'un tableau public static final
    Bonjour,
    La question a déjà due être posée mais je ne l'ai pas trouvé...

    Comment peut-on empêcher le remplacement des valeurs d'un tableau final static de String ?

    exemple :
    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
     
    public class TestClass
    {
        public static final String[] tab = { "maman", "papa", "fiston" };
     
        /**
         * 
         * @param args
         */
        public static void main(String[] args)
        {
            System.out.println(tab[0]);
            tab[0] = "tutéféavoir";
            System.out.println(tab[0]);
        }
    }
    En gros je voudrais transformer tab en pointeur constant sur un objet constant... (faire que tab[0]="toto" génère une erreur)
    mais je ne sais pas comment faire
    Quelqu'un aurait-il une idée ?

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il n'y a pas de solution dans le langage : un tableau est mutable !

    Tu pourrais passer par un List qu'il est simple de protéger, par contre cela ne te génèrera aucune erreur à la compilation mais seulement à l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        public static final List<String> tab = Collections.unmodifiableList(
        			Arrays.asList("maman", "papa", "fiston") );

    Sinon tu devras te faire ta propre classe conteneur immuable qui engloberait un tableau...

    a++

  3. #3
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 571
    Points : 15 538
    Points
    15 538
    Par défaut
    Je rajouterais que suivant les cas une Enum peut être une solution adaptée a ton problème.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Uther Voir le message
    Je rajouterais que suivant les cas une Enum peut être une solution adaptée a ton problème.
    +1


    De même il faut faire attention au coté thread-safe des objets non immuable en public static. Ils peuvent en effet être modifié depuis différents threads ce qui pourrait poser problème s'il ne gère pas un mécanisme de synchronisation...

    a++

  5. #5
    Membre du Club
    Développeur Back-End
    Inscrit en
    Mars 2005
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mars 2005
    Messages : 31
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Il n'y a pas de solution dans le langage : un tableau est mutable !
    C'est bien ce qu'on se disait...
    bha ça restera comme ça, on est coincé en jdk 1.4 et ça impacterai trop de passer à une List.
    Tant pis on fouettera le développeur qui osera changer le contenu du tableau à l'exécution

    Merci pour vos réponses

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Heu... L'API de Collections existe depuis Java 1.2 !

    a++

  7. #7
    Membre du Club
    Développeur Back-End
    Inscrit en
    Mars 2005
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Mars 2005
    Messages : 31
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Heu... L'API de Collections existe depuis Java 1.2 !

    a++
    Oui mais pas les enum comme le propose Uther

  8. #8
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 571
    Points : 15 538
    Points
    15 538
    Par défaut
    Comme la plupart des évolution du language Java, l'enum n'est quasiment que du sucre syntaxique. On peut très bien faire l'équivalent en java 1.4, c'est juste un peu plus verbeux.

    On a un comportement assez proche en remplacant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum Persone (maman, papa, fiston);
    par
    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
    final static class Personne{
        public static final Personne maman = new Personne("maman");
        public static final Personne papa = new Personne("papa");
        public static final Personne fiston = new Personne("fiston");
     
        private String value;
     
        private Personne(String value){
           this.value=value;
        }
     
        public String toString(){
           return this.value;
        }
    };

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 15/01/2011, 08h26
  2. public static []tableau (double []tableau) ?
    Par rXpCH dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 29/02/2008, 08h34
  3. differences static final - private protected
    Par fantomas261 dans le forum Langage
    Réponses: 2
    Dernier message: 27/05/2007, 12h24
  4. un tableau d'objets FINAL?
    Par d-a-v-e dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 01/01/2007, 23h02
  5. Modification d'un attribut static final
    Par n@n¤u dans le forum Langage
    Réponses: 8
    Dernier message: 19/06/2006, 17h19

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