Mon collègue a suggéré de rendre plus rigoureux plusieurs des paramètres de formatage de code et d'avertissement d'Eclipse. La majorité de ces changements sont logiques, mais je reçois cet avertissement bizarre 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 le ! !! me donne cet avertissement dans Eclipse avec mes nouveaux paramètres d'avertissement :
Accès au constructeur englobant WeirdInnerClassJavaWarning.InnerClass() est émulé par un accesseur synthétique synthétique. Augmenter sa visibilité améliorera améliorera vos performances.
Qu'est-ce que cela signifie ? L'avertissement disparaît lorsque je remplace "private static class" par "protected static class", ce qui n'a aucun sens pour moi.
éditer : J'ai finalement trouvé la "bonne" solution. Le vrai problème ici semble être que cette classe privée statique imbriquée n'a pas de constructeur public. Cette simple modification a permis de supprimer 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 que la classe soit une classe privée imbriquée (de sorte qu'aucune autre classe ne puisse y avoir accès, y compris les sous-classes de la classe englobante) et je veux qu'elle soit une classe statique.
Je ne comprends toujours pas pourquoi le fait de rendre la classe imbriquée protégée plutôt que privée est une autre méthode pour résoudre le "problème", mais peut-être est-ce une bizarrerie d'Eclipse.
(mes excuses, j'aurais dû l'appeler NestedClass au lieu de InnerClass pour être plus clair).