Mi compañero de trabajo sugirió que se hicieran más rigurosos los ajustes de formato de código y advertencia de Eclipse. La mayoría de estos cambios tienen sentido, pero recibo esta rara advertencia en Java. Aquí hay algunos códigos de prueba para reproducir el "problema":¿Advertencia de Eclipse sobre el acceso sintético para clases anidadas estáticas privadas en Java?
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 línea con el !!! me da esta advertencia en Eclipse con mis nuevas opciones de advertencia:
acceso a encerrar constructor WeirdInnerClassJavaWarning.InnerClass() se emula mediante un método de síntesis de acceso . Al aumentar su visibilidad, mejorará su rendimiento.
¿Qué significa esto? La advertencia desaparece cuando cambio "clase estática privada" a "clase estática protegida", lo cual no tiene sentido para mí.
edición: que finalmente descubrió la solución "correcta". El verdadero problema aquí parece ser que a esta clase estática privada anidada le falta un constructor público. Que un pellizco retira la advertencia:
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();
}
}
Quiero la clase que sea una clase anidada privada (por lo que ninguna otra clase puede tener acceso a ella, incluyendo las subclases de la clase envolvente) y yo quiero que sea un estático clase.
Todavía no entiendo por qué hacer que la clase anidada sea protegida en lugar de privada es otro método para solucionar el "problema", pero tal vez sea una peculiaridad o error de Eclipse.
(disculpas, debería haber llamado NestedClass en lugar de InnerClass a ser más clara.)
Supongo que estaba en el proceso de publicación antes de realizar mi edición. En cualquier caso, esta parece ser la respuesta correcta. –
Sí, tú y yo estábamos escribiendo al mismo tiempo. He extendido mi respuesta para explicar también por qué recibes la advertencia de Eclipse. – Eddie
+1 sobre el descompilador, nunca supe que existiera tal cosa.Parece que debería enviar un error para Eclipse para que cambien el texto de esta advertencia, para que quede un poco más claro qué significa esto y cuál debería ser la solución. –