Par codage sécurisé
Exemple de MAUVAIS code:
final class Publisher {
public static volatile Publisher published;
int num;
Publisher(int number) {
published = this;
// Initialization
this.num = number;
// ...
}
}
Si un objet d'initialisation (et, par conséquent, sa construction) dépend d'un contrôle de sécurité dans le constructeur, la vérification de la sécurité peut être contourné quand un non approuvés appelant obtient partiellement initialisé instance. Voir la règle OBJ11-J. Méfiez-vous de laisser les constructeurs de lancer des exceptions pour plus d'informations.
final class Publisher {
public static Publisher published;
int num;
Publisher(int number) {
// Initialization
this.num = number;
// ...
published = this;
}
}
Parce que le champ est non volatile et nonfinal, les instructions de
le constructeur peut être réorganisées par le compilateur de telle manière que
cette référence est publié avant l'initialisation déclarations
avoir exécuté.
Bon code:
final class Publisher {
static volatile Publisher published;
int num;
Publisher(int number) {
// Initialization
this.num = number;
// ...
published = this;
}
}
Cette référence est dit avoir échappé lorsqu'il est mis à la disposition
au-delà de son périmètre actuel. Suivants sont des moyens communs par lesquels le ce
de référence peut échapper:
Returning this from a non-private, overridable method that is invoked from the constructor of a class whose object is being
construite. (Pour plus d'informations, voir la règle MET05-J. de s'Assurer que
les constructeurs ne pas appeler les méthodes substituables.)
Retourner ce à partir d'une méthode non privées d'une mutable classe, ce qui permet à l'appelant de manipuler l'état de l'objet indirect. Cette
se produit généralement dans la méthode du chaînage des implémentations; voir la règle VNA04-J.
S'assurer que les appels à enchaînés méthodes sont atomiques pour plus d'informations.
En la passant comme argument pour un étranger de la méthode invoquée à partir du constructeur d'une classe dont l'objet est en cours de construction.
En utilisant les classes internes. Un intérieur de classe implicitement contient une référence à l'instance de l'extérieur de la classe, sauf l'intérieur de la classe est déclarée
statique.
La publication par l'attribution de ce à un public statique de la variable dans le constructeur d'une classe dont l'objet est en cours de construction.
Lancer une exception à partir d'un constructeur. Vous risqueriez de provoquer un code pour être vulnérable à un finaliseur attaque; voir la règle OBJ11-J. méfiez-vous de
laisser les constructeurs de lancer des exceptions pour plus d'informations.
Passage interne de l'état de l'objet à un étranger méthode. Cela permet à la méthode de récupérer la référence de l'intérieur de l'objet membre.
Cette règle décrit les conséquences potentielles de permettre à la ce
référence à l'évasion durant de construction de l'objet, y compris la race
les conditions et la mauvaise initialisation. Par exemple, la déclaration d'un champ
final ordinairement assure que tous les threads, voir entièrement
initialisé à l'état; toutefois, en permettant la cette référence à l'évasion
pendant la construction de l'objet peut exposer le champ à d'autres threads dans un
non initialisée ou partiellement initialisé à l'état. La règle TSM03-J. Ne pas
publier partiellement les objets initialisés, qui décrit les garanties
fournies par les différents mécanismes de sécurité de la publication, s'appuie sur
la conformité à cette règle. Par conséquent, les programmes ne doivent pas permettre le
cette référence à l'évasion durant de construction de l'objet.
En général, il est important de détecter les cas dans lesquels le ce
de référence peut s'échapper au-delà de la portée du contexte actuel. Dans
particulier, les variables et les méthodes doivent être soigneusement
un examen minutieux.