Mój współpracownik zasugerował, aby kilka z ustawień formatowania i ostrzeżeń Eclipse było bardziej rygorystycznych. Większość tych zmian ma sens, ale dostaję to jedno dziwne ostrzeżenie w Javie. Oto kod testowy do odtworzenia "problemu":Ostrzeżenie Eclipse na temat syntetycznego akcesorium dla prywatnych statycznych klas zagnieżdżonych w Javie?
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
Linia z !!! Daje mi to ostrzeżenie w Eclipse z moimi nowymi ustawieniami Ostrzeżenie:
Dostęp do załączając konstruktora WeirdInnerClassJavaWarning.InnerClass() jest emulowane przez syntetyczną accessor metody. Zwiększenie jego widoczności zwiększy Twoją wydajność.
Co to oznacza? Ostrzeżenie zniknie, gdy zmienię "prywatną klasę statyczną" na "chronioną klasę statyczną", co nie ma dla mnie żadnego sensu.
edit: w końcu zorientowali się, "prawidłowy" poprawkę. Prawdziwym problemem wydaje się być to, że tej zagnieżdżonej prywatnej klasie statycznej brakuje publicznego konstruktora. Że jeden uszczypnąć usuwane ostrzeżenie:
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();
}
}
chcę klasa być prywatny klasy zagnieżdżone (więc żadna inna klasa może mieć do niego dostęp, w tym podklas klasy okalającego) i chcę go mieć statyczny klasa.
Nadal nie rozumiem, dlaczego tworzenie zagnieżdżonej klasy chronionej, a nie prywatnej, jest inną metodą naprawy "problemu", ale być może jest to dziwactwo/błąd Eclipse.
(przepraszam, powinienem nazwali to NestedClass zamiast InnerClass być bardziej jasne.)
Tak, ty i ja piszemy w tym samym czasie. Rozszerzyłem moją odpowiedź, aby również wyjaśnić, dlaczego otrzymujesz ostrzeżenie Eclipse. – Eddie
+1 o dekompilatorze, nigdy nie wiedziałem, że coś takiego istnieje.Wygląda na to, że powinienem zgłosić błąd dla Eclipse, że powinni zmienić tekst tego ostrzeżenia, aby było trochę bardziej zrozumiałe, co to oznacza i jaka powinna być poprawka. –
Najlepszym rozwiązaniem, o ile nie jest to projekt J2ME, jest wyłączenie ostrzeżenia w Eclipse i napisanie kodu zgodnie z intencją użytkownika. Po JIT wynik będzie albo znikomy, albo zero. – Darron