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 ????
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.
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.
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);
}
}
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.
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 )
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.