En d'autres termes, pourquoi auriez-vous besoin d'un initialiseur d'instance? Quelle différence ou avantage avez-vous en écrivant un initialiseur d'instance sur un constructeur?En quoi un initialiseur d'instance est-il différent d'un constructeur?
Répondre
Cela semble bien l'expliquer:
initialiseurs instance sont une alternative intéressante à l'instance variables initializers chaque fois:
code initialiseur doit prendre des exceptions ou
effectuer calculs de fantaisie qui ne peuvent pas être exprimés avec un initialiseur de variable d'instance. Vous pouvez, bien sûr, toujours écrire un tel code dans les constructeurs .
Mais dans une classe qui avait plusieurs constructeurs, vous devrez répéter le code dans chaque constructeur. Avec un initialiseur d'instance, vous pouvez simplement écrire le code une fois, et il sera exécuté quel que soit le constructeur utilisé pour créer l'objet. Les initialiseurs d'instance sont également utiles dans les classes internes anonymes, qui ne peuvent pas déclarer les constructeurs du tout.
De: JavaWorld Object initialization in Java.
D'autre part, vous pouvez écrire du code une fois dans un constructeur et l'appeler de tous les autres constructeurs. Mais les classes internes anonymes font un bon point. –
Vous pouvez l'appeler à partir d'autres constructeurs, mais vous répétez l'appel. Si vous ajoutez un nouveau constructeur, vous devez vous rappeler d'y ajouter l'appel. Ce n'est pas le cas avec un initialiseur d'instance. – talonx
@talonx, je suis d'accord avec votre argument sur l'oubli, mais l'utilisation du comportement par défaut est tout aussi dangereuse. Lorsqu'un supporter lit un constructeur dans un code existant, on ne se souvient pas toujours de vérifier les initialiseurs d'instance possibles. Alors qu'un init() explicitement utilisé va ressortir. – Assambar
Lorsque vous avez plusieurs constructeurs et que vous voulez exécuter un code commun pour chaque constructeur, vous pouvez utiliser l'initialiseur d'instance.Comme il est appelé pour tous les constructeurs.
En termes de cycle de vie de l'objet, il n'y a pas de différence. Les deux sont invoqués au moment de la construction et, logiquement, le bloc d'initialisation peut être considéré comme faisant partie de la construction.
sémantiquement, un initialiseur est un outil agréable d'avoir pour plusieurs raisons:
l'initialiseur peut améliorer la lisibilité du code en gardant la logique d'initialisation à côté de la variable en cours d'initialisation:
public class Universe {
public int theAnswer;
{
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
}
// a bunch of other vars
}
vs
public class Universe {
public int theAnswer;
// a bunch of other vars
public Universe() {
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
// other constructor logic
}
}
Les initialiseurs sont invoqués indépendamment de dont le constructeur est utilisé.
Les initialiseurs peuvent être utilisés dans des classes internes anonymes, ce que les constructeurs ne peuvent pas faire.
Ce que vous avez est techniquement un "initiateur de variable d'instance" et non un "initiateur d'instance" (un bloc directement imbriqué dans une classe). Voir JLS 3ème section 8.6. –
Oh, d'accord. Changé l'exemple. – ykaganovich
Le bloc d'initialisation d'instance n'a pas de nom comme indiqué [ici] (http://www.javatpoint.com/instance-initializer-block). N'est-ce pas? Vous avez marqué votre code d'initialisation de l'instance avec le nom 'theAnswer'. Est-ce exact? ou il me manque quelque chose. – RBT
Je voudrais éviter l'idiome de l'initialiseur d'instance en général - le seul véritable avantage qu'il donne sur les initialiseurs de variables est la gestion des exceptions. Et comme une méthode init (appelable du constructeur) peut aussi gérer les exceptions et centraliser le code de configuration du constructeur, mais a l'avantage de pouvoir fonctionner sur les valeurs des paramètres constructeurs, je dirais que l'initialiseur d'instance est redondant, et donc à éviter.
L'initialiseur est un moyen de partager du code entre les constructeurs et rend le code plus lisible si l'initialisateur est utilisé avec la déclaration de variable.
Le compilateur Java copie les blocs d'initialisation dans chaque constructeur. Par conséquent, cette approche peut être utilisée pour partager un bloc de code entre plusieurs constructeurs. Oracle documentation
Le avantage réel d'exemple initializers sur les constructeurs est vu lorsque nous utilisons une classe interne anonyme.
classes internes anonymes ne peuvent pas avoir un constructeur (comme ils sont anonymes) ,si ils sont un ajustement assez naturel pour exemple initializers.
Les initialiseurs d'instance sont assez rares (à moins que vous ne tombiez dans le code d'une personne friande de l'idiome de double accolade). –