Eclipse avertissement sur synthétique accesseur pour private static classes imbriquées en Java?
Mon collègue de travail m'a suggéré de faire plusieurs Eclipse code de mise en forme et les paramètres d'avertissement à être plus rigoureux. La majorité de ces changements ont un sens, mais je reçois ce un étrange avertissement en Java. Voici un code de test pour reproduire le "problème":
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass(); //!!!
this.anInstance.doSomething();
}
}
//using "this.anInstance" instead of "anInstance" prevents another warning,
//Unqualified access to the field WeirdInnerClassJavaWarning.anInstance
La ligne avec l' !!! me donne ce message d'avertissement dans Eclipse avec mon nouveau les paramètres d'avertissement:
L'accès à l'enfermant constructeur
WeirdInnerClassJavaWarning.InnerClass()
est émulé par un accesseur synthétique
la méthode. Augmenter sa visibilité
d'améliorer vos performances.
Qu'est-ce que cela signifie? L'avertissement disparaît quand je change de "private static class" à "protégés statique de la classe", qui n'a pas de sens pour moi.
edit: j'ai enfin trouvé la "bonne" fix. Le vrai problème ici semble être que cette imbriquée privé de classe statique est pas un constructeur public. Que l'un tweak supprimé l'avertissement:
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
public InnerClass() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass();
this.anInstance.doSomething();
}
}
Je veux la classe d'être un privé classe imbriquée (si aucune autre classe ne peut avoir accès, y compris les sous-classes de la classe englobante) et je veux que ce soit une classe statique.
Je ne comprends toujours pas pourquoi faire une classe imbriquée protégés plutôt que privé, est une autre méthode de fixation sur le "problème", mais peut-être que c'est un caprice/bug d'Eclipse.
(toutes mes excuses, j'aurais appelé NestedClass au lieu de InnerClass d'être plus clair.)
- Je ne comprends pas un point: quelle est l'utilité d'avoir un intérieur de classe qui ne peut pas être utilisé par quelqu'un d'autre? Je pense que je vais mettre la classe dans un fichier de classe et de laisser les autres programmeurs choix si c'est utile pour d'autres étendues ou non.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez vous débarrasser de l'avertissement comme suit:
Comme d'autres l'ont dit, l'Éclipse est de se plaindre parce qu'un cours privé avec pas explicite constructeur ne peut pas être instancié à partir de l'extérieur, à l'exception de via la méthode de synthèse que le compilateur Java crée. Si vous prenez votre code, le compiler, puis le décompiler avec jad (*), vous obtenez le résultat suivant (restructuré):
Si vous ajoutez un protégé du constructeur, la synthèse de code est inutile. La synthèse de code est, théoriquement, je suppose, plus lente d'un minescule montant que les non-synthétique code à l'aide d'un public ou protégé constructeur.
(*) Pour jad, j'ai fait un lien vers une page de Wikipédia ... le domaine qui a accueilli ce programme a expiré, mais le lien avec Wikipédia à l'autre que je n'ai pas testé moi-même. Je sais qu'il y a d'autres (peut-être plus récents), la décompilation, mais c'est celui que j'ai commencé à l'utiliser. Remarque: Il se plaint lors de la décompilation récents les fichiers de classe Java, mais il a encore fait un bon travail.
Par ailleurs, le paramètre pour activer l'avertissement off est la Java des Erreurs/Avertissements de la page, sous "Code de style" et est appelé:
Vous ne pouvez pas instancier InnerClass de WeirdInnerClassJavaWarning. Il est privé, la JVM ne les laissez pas vous, mais le langage Java (pour certaines raisons) serait.
Donc, javac ferait une méthode supplémentaire dans InnerClass qui serait le juste retour de nouvelles InnerClass(), donc vous permettre de créer InnerClass instances de WeirdInnerClassJavaWarning.
je ne pense pas que vous avez vraiment besoin de se débarrasser de lui, parce que la performance baisse serait inmeasureably minuscule. Cependant, vous pouvez, si vous le voulez vraiment.
Qui n'est pas un caprice/bug de l'Éclipse, juste une fonctionnalité de Java. Le Java Langage De Spécification, 8.8.9 dit:
Pour aider les gens, ici est ce que vous obtenez si vous utilisez la classe d'origine code de la question avec
Sortie Raw, compilateur ajouté les commentaires. Notez l'ajout de la synthèse colis privé de classe et un constructeur.
Vous devriez être en mesure de se débarrasser de lui en utilisant l'étendue par défaut au lieu de privé ou protégé, c'est à dire
Il est également intéressant de noter que mon plaçant votre curseur sur la ligne de code, avec l'avertissement et en appuyant sur ctrl-1, Eclipse peut être en mesure de réparer automatiquement pour vous.