web-dev-qa-db-fra.com

Création de Hashtable comme final dans java

Comme nous le savons, le but du mot-clé "final" en Java. Tout en déclarant une variable comme finale, nous devons initialiser la variable. comme "final int a = 10;" Nous ne pouvons pas changer la valeur de "a". Mais si nous optons pour HashTable, il est possible d'ajouter de la valeur même en déclarant HashTable comme final.

Exemple::

 private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() 
{{     put("foo",      1);     
       put("bar",      256);     
       put("data",     3);     
       put("moredata", 27);     
       put("hello",    32);     
       put("world",    65536);  }}; 

Maintenant, je déclare la table de hachage MYHASH comme finale. Si j'essaye d'ajouter quelques éléments à cela, c'est son acceptation.

MYHASH.put("NEW DATA",      256);

Maintenant, les "NOUVELLES DONNÉES" sont ajoutées au HashTable. Ma question est pourquoi son permettre d'ajouter même sa déclaration comme finale ????

35
Sathish

Parce que final marque la référence, pas l'objet. Vous ne pouvez pas faire ce point de référence vers une autre table de hachage. Mais vous pouvez tout faire pour cet objet, y compris ajouter et supprimer des choses.

Votre exemple de int est un type primitif, pas une référence. Final signifie que vous ne pouvez pas modifier la valeur de la variable. Donc, avec un int vous ne pouvez pas changer la valeur de la variable, par ex. rendre la valeur de int différente. Avec une référence d'objet, vous ne pouvez pas modifier la valeur de la référence, c'est-à-dire vers quel objet elle pointe.

75
Joe

Seule la référence est définitive, ses méthodes peuvent bien sûr être appelées comme pour une référence non finale.

Utilisez Collections.unmodifiableMap(map) pour rendre une carte non modifiable.

13
Ingo Kegel

Vous pouvez utiliser Collections.unmodifiableMap pour obtenir un wrapper non modifiable sur votre table de hachage.

Exemple:

import Java.util.*;
class Test{

    public static final Map<String,Integer> MYHASH;
    static{
        Hashtable<String,Integer> tmp = 
            new Hashtable<String,Integer>();
        tmp.put("A",65);
        tmp.put("C",67);
        MYHASH = Collections.unmodifiableMap(tmp);
    }

    public static void main(String[] args){

        System.out.println(MYHASH.get("A"));

        //this will throw
        //Java.lang.UnsupportedOperationException
        MYHASH.put("B",66);    

    }

}
12
Vlad

Essayez d'envelopper votre Hashtable avec une carte non modifiable en utilisant Collections.unmodifiableMap( MYHASH ). Cela devrait lever des exceptions lorsque vous essayez de changer quelque chose dans la carte, c'est-à-dire ajouter ou supprimer des entrées. (Notez que MYHASH doit alors être de type Map<String, String> et pas Hashtable<String, String>.)

Concernant le mot clé final: comme les autres l'ont déjà dit, cela signifie que vous ne pouvez pas affecter un autre Hashtable à MYHASH mais la carte elle-même est toujours modifiable. Pour changer cela, vous devez l'envelopper avec un wrapper immuable, comme le UnmodifiableMap mentionné ci-dessus.

6
Thomas

Comme Joe l'a dit, c'est parce que final marque la référence et non l'objet.

Cependant, vous pouvez faire ce que vous voulez avec Collections.unmodifiableMap (voir ici )

4
Jeff Foster

Pour les champs et les variables, l'utilisation de final signifie qu'ils ne peuvent être affectés qu'une seule fois. Soit immédiatement, soit ultérieurement (par exemple dans un constructeur de champs). Cela ne signifie pas que l'instance réelle devient immuable. Une table de hachage est une structure de données à laquelle vous pouvez ajouter des entrées, quelle que soit la façon dont elle a été affectée à une variable. Seul référence est final.

0
G_H