Ce n'Collections.unmodifiableSet() faire en Java?
Je peux voir que Collections.unmodifiableSet
retourne un inmodifiable vue de l'ensemble, mais je ne comprends pas pourquoi on ne peut pas utiliser le final
modificateur pour accomplir cette tâche.
Dans ma compréhension, final
déclare une constante: quelque chose qui ne peut pas être modifié. Donc, si un jeu est déclaré comme une constante, alors il ne peut pas être modifié: rien ne peut être enlevé de l'ensemble et rien ne peut être ajouté.
Pourquoi avons-nous besoin Collections.unmodifiableSet
?
Vous devez vous connecter pour publier un commentaire.
final
déclare un objet de référence qui ne peut pas être modifié, par exemplecrée un nouveau
Foo
et des lieux de référence danssomething
. Par la suite, il n'est pas possible de modifiersomething
de pointer vers une autre instance deFoo
.Cela ne pas empêcher toute modification de l'état interne de l'objet. Je peux toujours appeler toutes les méthodes sur
Foo
y sont accessibles à la portée. Si une ou plusieurs de ces méthodes modifie l'état interne de l'objet, puisfinal
ne vais pas l'en empêcher.En tant que tel, les éléments suivants:
ne pas créer un
Set
qui ne peut pas être ajouté ou altéré; il signifie simplement quefixed
ne jamais référence à cette instance.En revanche, en faisant:
crée une instance d'un
Set
qui lanceraUnsupportedOperationException
si l'on tente d'appelerfixed.add()
oufixed.remove()
, par exemple - l'objet lui-même de protéger son état interne et l'empêcher d'être modifié.Par souci d'exhaustivité:
crée une instance d'un
Set
qui ne permet pas de son état interne d'être changé, et signifie également quefixed
ne jamais pointer à une instance de ce jeu.La raison que
final
peut être utilisé pour créer des constantes de primitives est basée sur le fait que la valeur ne peut pas être changé. Rappelez-vous quefixed
ci-dessus était juste une référence à une variable contenant une adresse qui ne peut pas être changé. Eh bien, pour les primitives, par exemplela valeur de
ANSWER
est que de 42. DepuisANSWER
ne peut pas être changé, il ne pourront jamais avoir la valeur 42.Un exemple qui brouille toutes les lignes serait celui-ci:
Par les règles ci-dessus,
QUESTION
contient l'adresse d'une instance deString
qui représente "L'ultime question", et que l'adresse ne peut pas être changé. La chose à retenir ici est queString
lui-même est immuable - vous ne pouvez rien faire à une instance deString
qui change, et toutes les opérations qui seraient autrement (commereplace
,substring
, etc.) retour références à tout à fait différentes instances deString
.final
garantit seulement que le référence à l'objet de la variable représente ne peut pas être changé, il ne fait rien pour l'instance de l'objet et sa mutabilité.final Set s = new Set();
juste des garanties que vous ne pouvez pas faires = new Set();
de nouveau. Il ne veut pas faire le jeu inmodifiable, si ne vous ne pouvez pas ajouter quoi que ce soit, pour commencer. Donc, pour le rendre vraiment clair,final
affecte uniquement la variable référence pas l'objet de points de référence.Je peux faire ce qui suit:
mais je ne peux pas faire cela.
encore en raison de la
final
je ne peux pas modifier le type de la variable l points à.que vous avez à faire une des trois choses suivantes pour faire un contenant de Collecte thread-safe.
ou
ou
utilisez l'une des conteneurs appropriés de
java.util.concurrency.* package
.si j'avais un
Person
objet et n'afinal Person p = new Person("me");
cela signifie que je ne peux pas réaffecterp
à point à un autrePerson
objet. Je peux encore fairep.setFirstName("you");
Ce qui confond la situation est que
ressembler
const
en C++, alors qu'en fait, les objets qu'ils désignent sont immuables/inmodifiable par la nature. Des conteneurs ou des objets avec mutateur méthodes qui peuvent modifier l'état interne de l'objet ne sont pasconst
juste le référence à ces objets sontfinal
et ne peut pas être réaffectés à référence un autre objet.final
n'est pas C++-style)const
. Contrairement au C++, Java n'a pasconst
-méthodes ou quelque chose comme ça, et les méthodes qui permettent de modifier l'objet peut être appelée par unfinal
de référence.Collections.unmodifiable*
est un wrapper qui applique (au moment de l'exécution, et non à la compilation) la lecture-seule-ness pour la collection concernée.La
Collections.unmodifiableSet(Set<? extends T>)
permettra de créer un wrapper sur le jeu original. Ce wrapper set ne peut pas être modifié. mais encore le jeu d'origine peut être modifié.Exemple:
De l'ajout de certains éléments
Impression ajouté des éléments
Mettre le
actualSet
en inmodifiable ensemble et assignés à la nouvelle référence(wrapperSet
).Imprimer le wrapperSet. alors il aura
actualSet
Valeurspermet d'essayer de supprimer/ajouter un élément sur
wrapperSet
.Ajouter un élément de plus dans
actualSet
Impression
actualSet
etwrapperSet
. les deux ensembles de valeurs sont les mêmes. donc, Si vous ajouter/supprimer des éléments réels que les modifications seront répercutées sur wrapper set.Utilisation:
Ce
Collections.unmodifiableSet(Set<? extends T>)
est utilisé pour empêcher la modification de l'Ensemble de la méthode de lecture de n'importe quel objet. disonsRésumer ce que nous pouvons faire et ne peut pas:
Préparation:
Finale par référence
peut:
ne peut pas:
Finale par référence et inmodifiable par collecte.
finale privée Jeu de mots = Collections.unmodifiableSet(mots);
peut:
ne peut pas:
Finale par référence et inmodifiable par la collection, mais réciproque, la collecte de l'objet.
Mais si vous disposez de la collection avec mutuelle objets vous pouvez MODIFIER l'état interne de l'objet.
Toujours pas
Mais peut