Comment dois-je déclarer une constante de le rendre visible pour chaque instance de la classe?
Je voudrais avoir une constante dans ma classe qui serait visible pour toutes les instances de la classe.
Tout d'abord, je ne sais pas si j'ai besoin de le déclarer comme "statique". Autant je comprends tout changement d'un champ statique (fait par l'une des instances) qui sera vu par les autres instances (de manière statique de la variable n'est pas liée à une instance spécifique). En outre, un champ statique modifications peuvent être apportées sans l'utilisation de n'importe quelle instance (nous travaillons directement avec la classe). Donc, toutes ces propriétés spéciales du champ statique sont liés à la façon dont il peut être changé et quels en seront les effets de ces changements. Mais dans mon cas, je voudrais avoir une constante (de sorte que les "changements" questions ne sont pas pertinentes ici). Alors, probablement que je n'ai pas besoin d'utiliser "statique". Droit?
Deuxième, mon jeu contient un grand nombre d'éléments et je ne veux pas définir la valeur de l'ensemble à la fois (quand j'ai créer la variable). En d'autres termes, je voudrais déclarer un ensemble, puis ajouter des éléments de cet ensemble, étape par étape. Mais je ne peux pas le faire si je travaille avec des constantes. Est-il possible d'spécifié de la valeur de l'ensemble et ensuite faire-il constant?
Troisième, j'ai réalisé qu'il peut y avoir quelques problèmes si j'essaie de modifier la valeur des variables en dehors de toute méthode. Donc, comment ça fonctionne?
AJOUTÉ:
OK. Merci pour la réponse, j'ai compris qu'il devrait être "définitive" et "statique" (puisqu'il est constant et il ne sera pas associé à un cas particulier, il devrait juste être visible à l'ensemble des instances de la classe). Cependant j'ai encore un problème. Je voulais spécifier le jeu en utilisant "ajouter" et je ne peux pas ajouter à la série si elle est constante (final). De plus, je ne peut pas modifier les valeurs des variables en dehors de méthodes (pourquoi?). De toute façon, je ne suis pas d'insister sur l'utilisation de "ajouter" pour définir l'ensemble. Je suis prêt à le définir à la fois. Mais je ne sais pas comment le faire. J'ai essayé des choses comme ça:
final static Set allowedParameters = new HashSet("aaa","bbb");
final static Set allowedParameters = new HashSet(["aaa","bbb"]);
final static Set allowedParameters = new HashSet({"aaa","bbb"});
final static Set allowedParameters = new HashSet(Arrays.asList({"userName"}));
Et ils n'ont pas de travail.
AJOUTÉ 2:
Quelqu'un peut-il m'expliquer, les moyens, le code donné par Tadeusz Kopec?
class YourClass {
private static void fillSet(Set<SomeType> set) {
//here you add elements, like
set.add(new SomeType());
}
private final static Set<SomeType> yourSetField;
static {
final Set<SomeType> tempSet = new HashSet<SomeType>();
fillSet(tempSet);
yourSetField = Collection.unmodifiableSet(tempSet);
}
}
1. Le fillSet
méthode a une variable appelée "set". Pourquoi il n'est pas utilisé dans la méthode?
2. Qu'est-ce que SomeType()
dans le fillSet
? Quelle est cette méthode?
3. Ce n' fillSet
faire? Plus tard dans l'exemple, nous donnons un ensemble vide de cette méthode. Pour quoi?
4. Pour quoi faire nous déclarons tempSet
comme définitive?
5. Qu'est-ce exactement unmodifiableSet
faire? Selon le nom qu'il génère un ensemble qui ne peut pas être modifié, je pense. Mais pourquoi serait-il insuffisant pour déclarer yourSetField
comme final
? Qu'il serait constante.
"Je ne veux pas définir la valeur de l'ensemble à la fois". Qu'est-ce que cela signifie? que vous voulez être en mesure d'ajouter à l'ensemble dans l'avenir?
Oui.
Je voulais dire que, dans le début de mon programme, je tiens à préciser en ajoutant de nouveaux éléments (étape par étape). Après cela, je ne veux pas changer le jeu plus. Donc, je ne veux pas être en mesure d'ajouter à l'ensemble dans l'avenir.
L'utilisation d'un initialiseur statique bloc. Regarde ma réponse.
OriginalL'auteur Roman | 2010-03-10
Vous devez vous connecter pour publier un commentaire.
Voulez-vous ajouter des éléments à votre jeu une fois et ensuite seulement de lire son contenu ou voulez-vous être en mesure d'ajouter des éléments à tout moment? Si vous créez une fois, faire comme ceci:
Maintenant - c'est privé, donc pas de l'un à l'extérieur de votre classe peut accéder. Et son inmodifiable, afin que personne ne peut changer son contenu.
Si vous souhaitez ajouter des éléments à tout moment, vous avez un problème de simultanéité - lire extraneon de réponse.
MODIFIER
Comme demandé-je expliquer ce que ce code ne.
Première mystérieux <> entre parenthèses:
Je suppose que vous utilisez Java 1.5 ou supérieur et utilisé les génériques. En quelques mots: si vous déclarez une variable de type Liste, il contient des Objets. Si vous souhaitez conserver les Chaînes en elle, vous avez à jeter lorsque vous les récupérer à partir de votre Liste. Exemple
Le casting de la Chaîne est nécessaire. En outre, rien ne vous empêche d'ajouter BigDecimal à myList. Mais si vous le récupérer et essayer de jeter à la Chaîne, vous obtenez ClassCastException.
Donc Java 1.5 introduit génériques. Vous pouvez spécifier, que la Liste ne peut contenir que des Chaînes de caractères. Syntaxe utilise <> entre parenthèses:
Même chose s'applique à d'autres collections, comme des Ensembles. J'ai écrit sur les Listes en raison de la récupération à partir des Listes est plus pratique. J'ai utilisé
SomeType
dans mon exemple parce que je ne sais pas ce que vous voulez garder dans votre Ensemble. Vous devez le remplacer par le type d'objets que vous souhaitez stocker.Maintenant - blocs statiques. Il y a deux façons d'initialiser les champs statiques - directement dans leur déclaration:
Ceci est utile si la valeur initiale est une expression simple.
Ou dans initialisation statique bloc
C'est utile, si la valeur initiale de certains champs statiques besoins d'autres plus compliqués calculs.
Et maintenant à vos questions
set
defillSet
est utilisé. Il y a un élément, ajouté à cela:set.add(new SomeType());
SomeType
. Il doit être remplacé par le type que vous souhaitez utiliser.new SomeType();
crée une instance d'un (hypothétique)SomeType
en appelant son constructeur sans paramètre.fillSet
fait exactement ce que son nom signifie - prend un ensemble et le remplit (ajoute certaines valeurs). Nous donnons un ensemble vide de sorte que, comme un résultat, nous obtenons un jeu avec des élémentsfillSet
a mis en elle.fillSet
est un endroit où vous devez mettre tout le code qui initialise votre jeu. Il est bon d'avoir cette séparés.tempSet
est une variable locale statique dans l'initialisation du bloc qui est attribué une fois et de ne jamais réattribué. Pour exprimer cela, je le déclarer finale. C'est une habitude que j'ai reçu de l'aide de findBugs et je pense que c'est bon pour des raisons de lisibilité.yourSetField = new HashSet<SomeType>()
une fois qu'il est initialisé. Mais n'importe qui peut accéder àyourSetField
pouvez écrireyourSetField.add(...)
. SiyourSetField
est un unmodifiableSet, en ajoutant à cela provoquera une exception lors de l'exécution (UnsupportedOperationException
). En d'autres termes: final signifie que vous ne pouvez pas faireyourSetField
point à un autre objet (et le compilateur garantit). unmodifiableSet signifie que vous ne pouvez pas ajouter ou supprimer des objets de l'ensemble. Elle compile mais pause dans l'exécution.static {...}
moyens. J'ai toujours pensé que c'est juste un modificateur pour les champs et les méthodes. Mais apparemment ce n'est pas le cas. J'ai aussi ne pas comprendre ce genre de choses<>
. Dois-je vraiment besoin de mettre ces supports? Ou ils indiquent simplement que c'est quelque chose de facultatif? Dois-je remplacer SomeType ou <SomeType>?OK. J'ai eu la
static block
choses.<>
est encore sous la question.Le <...> font partie des médicaments Génériques, de la spécification. Wikipédia a un bon article sur: en.wikipedia.org/wiki/Generics_in_Java
Faute de frappe dans le code: il est
Collections.unmodifiableSet
(au pluriel), pasCollection.unmodifiableSet
OriginalL'auteur Tadeusz Kopec
Dans votre classe, vous voulez quelque chose comme:
Je voudrais aller avec la Goyave
ImmutableSet
comme Jon suggère, donc, si vous voulez être à l'aide de laof( ... )
méthode ou le constructeur de l'interface (si vous avez une sorte de flux de données - si vous êtes coder en dur les données, il suffit d'utiliser de l'()), qui sont tous deux assez bien couvert dans l'API. D'autres options incluent l'emballage par le inmodifiable méthode de Collections.OriginalL'auteur Carl
Il semble que vous ne voulez statique, pas à cause de la manière dont les modifications sont prises en compte, mais parce que ce n'est pas spécifiques à une instance de votre classe.
Je vous suggère de faire une dernière variable statique, et dans un initialiseur statique bloc pour votre type de la construction d'un ensemble, puis de créer un immuable ensemble (par exemple, l'un fourni dans Goyave) de la régulière. Attribuer immuable de référence définie à vos statique de la variable finale. Le travail est accompli.
Yup, la corriger.
OriginalL'auteur Jon Skeet
Je pense que vous savez ce que
static
moyens. Comme vous l'avez mentionné le Jeu, mais pas le contenu, est une "constante", qui est, en aucun cas de mettre un autre Jeu là, vous feriez bien d'en fairefinal
.Un dernier Ensemble statique est la même pour toutes les instances, et le contenu de qui peut être changé par toutes les instances.
Un autre problème se pose maintenant; la simultanéité. Si plusieurs instances de votre classe m,odify le Jeu en même temps? Que doit faire le Jeu de le faire? Vous pourriez attraper que par emballage de votre jeu dans un Synchronisés Ensemble.
Dans l'ensemble je pense que la déclaration devrait ressembler à:
où le contenu qui vous permet de connaître à l'avance peut être rempli dans le bloc statique comme Bozho a montré, et les autres éléments peuvent être ajoutés au moment de l'exécution.
Avec une telle déclaration comme
échouera comme il est censé faire, et les mises à jour simultanées pour le jeu fonctionnera.
Si vous avez besoin d'un Jeu avec des valeurs constantes, vous pouvez faire:
Mais je vois quelqu'un d'autre a d'abord été 🙂
final static Set nameOfSet = new HashSet("aaa","bbb")
ne fonctionnent pas.J'ai aussi ne pas comprendre la différence entre "constant" et "constante du contenu de l'ensemble". Pour moi c'est la même chose. Je pense que le jeu n'est constante si sa valeur (le contenu) est constante.
OriginalL'auteur extraneon