Initialiser la variable finale avant de constructeur en Java
Est-il une solution pour utiliser une variable finale dans une Java constructeur?
Le problème est que si j'initialise un champ final comme:
private final String name = "a name";
alors je ne peut pas l'utiliser dans le constructeur. Java s'exécute en premier le constructeur et ensuite les champs. Est-il une solution qui me permet d'accéder à la finale de terrain dans le constructeur?
Je suppose que vous voulez changer la valeur dans le constructeur de droite ?
Je vote pour le fermer car, selon ma compréhension, il s'avère que ce n'est pas vraiment un problème. Ce que l'OP est en train de faire devrait fonctionner.
Le constructeur implicitement exécute le champ initialisation immédiatement avant l'appel de la super constructeur.
en fait, tout le champ de l'initialisation se produit après l'appel du constructeur de la superclasse. Essayez de regarder le pseudo-code et de voir. En vertu de la spécification de la JVM, il est possible d'initialiser les champs avant de le ctor appel, mais Javac n'est jamais le cas.
Oups, oui. Effectivement l'extérieur cette de un intérieur de classe est disponible lors de l'appel à super (
Je vote pour le fermer car, selon ma compréhension, il s'avère que ce n'est pas vraiment un problème. Ce que l'OP est en train de faire devrait fonctionner.
Le constructeur implicitement exécute le champ initialisation immédiatement avant l'appel de la super constructeur.
en fait, tout le champ de l'initialisation se produit après l'appel du constructeur de la superclasse. Essayez de regarder le pseudo-code et de voir. En vertu de la spécification de la JVM, il est possible d'initialiser les champs avant de le ctor appel, mais Javac n'est jamais le cas.
Oups, oui. Effectivement l'extérieur cette de un intérieur de classe est disponible lors de l'appel à super (
-target 1.4
ou plus tard).
OriginalL'auteur Tobias | 2009-03-24
Vous devez vous connecter pour publier un commentaire.
Je ne comprends pas vraiment ta question. Que
s'exécute comme suit:
OriginalL'auteur Johannes Weiss
Effectuer l'initialisation dans le constructeur, par exemple,
Bien sûr, si vous savez vraiment de la valeur à la déclaration de la variable de temps, il est plus judicieux d'en faire une constante, par exemple,
OriginalL'auteur Hank Gay
Nous sommes loin de la question.
Oui, vous pouvez utiliser un
private final
variable. Par exemple:Ce que cela signifie, c'est que le Compte de classe a d'une dépendance sur les deux Chaînes, de compte et les numéros d'acheminement. Les valeurs de ces attributs de classe DOIT être définie lors de la classe de Compte est construit, et ces chiffres ne peuvent pas être modifiés sans créer une nouvelle classe.
La "finale" modificateur ici, les attributs immuables.
J'obtiens une erreur "impossible d'affecter une valeur à la variable finale de la valeur".
OriginalL'auteur Steve Gelman
Marquant statique, vous permettra de l'utiliser dans le constructeur, mais puisque vous l'avez fait final, il ne peut pas être changé.
est possible d'utiliser un statique init bloc.
Si vous essayez de modifier la valeur dans le constructeur, alors vous ne pouvez pas affecter une valeur par défaut ou vous avez à faire à ne pas finale.
ou
OriginalL'auteur sfossen
Dans ce cas, vous pouvez marquer le champ comme "statique".
Pourquoi ne voulez-vous pas un champ statique?
Il est immuable, de sorte que vous pourriez aussi bien le faire statique.
non, dans un environnement multi-utilisateur static var. arent le meilleur moyen...
Il est immuable. Il n'y a pas partagé mutable état, donc pas de problème de concurrence. Vous auriez raison si il n'y a pas eu de finale.
OriginalL'auteur Outlaw Programmer
Une autre possibilité consiste à initialiser le champ dans une instance de l'initialiseur de bloc:
OriginalL'auteur Joachim Sauer
Dans ce cas, vous pourriez aussi bien le faire statique, trop. Et Java convention a pour nom de ces constantes dans ALL_CAPS.
OriginalL'auteur Adam Jaskiewicz
où getName() est une fonction statique qui vous obtient le nom.
OriginalL'auteur daanish.rumani
Ce n'est pas correct, les champs sont évaluées en premier, sinon vous risquez de ne pas accéder à toutes les valeurs par défaut des membres de votre constructeur, car ils ne sont pas initialisés. Cette ne travail:
Le mot-clé final ne marque que le membre constant, il est traité comme n'importe quel autre membre du contraire.
EDIT: Êtes-vous essayer de ensemble la valeur dans le constructeur? Qui ne fonctionne pas, puisque le membre est immuable si elle est définie comme définitive.
Eh bien, ok. Les disciplines évaluées en premier néanmoins.
OriginalL'auteur soulmerge