java clase interna anónima código inalcanzable
-
16-10-2019 - |
Pregunta
compilador de Java se queja cuando se escribe un código que es inalcanzable. Por ejemplo
public void go()
{
return;
System.out.println("unreachable");
}
Sin embargo, cuando se define un nuevo método en una clase anónima que no se puede acceder desde cualquier lugar, el compilador no se queja. Se le permite hacer eso, ¿por qué? Por ejemplo,
class A
{
public void go()
{
System.out.println("reachable - A");
}
}
class B
{
public static void main(String [] args)
{
A a = new A() {
public void go()
{
System.out.println("reachable - B");
}
public void foo()
{
System.out.println("unreachable - B");
}
};
a.go(); // valid
a.foo(); // invalid, compiler error
}
}
Solución
En primer lugar: Eclipse no Notificar a mi foo()
que no se utiliza localmente. Es una advertencia y no un error, sin embargo, por razones señaladas por los otros anserws.
Tenga en cuenta que hay una manera de foo()
alcance:
new A() {
public void go()
{
System.out.println("reachable - B");
}
public void foo()
{
System.out.println("unreachable - B");
}
}.foo();
Estos trabajos, debido a que el tipo de la expresión no es new A() {}
A
, pero en realidad la subclase anónima de A
. Y que tiene un método subclase foo
público.
Dado que no se puede tener una variable con el mismo tipo, que pueda foo()
no el acceso de esta manera a partir de una variable.
Otros consejos
eso es sólo equivalente a lo que le permite crear métodos privados que no son llamadas en cualquier lugar de la clase, de verdad. No es código inalcanzable en el mismo sentido bastante -. Y podría puede acceder por la reflexión
Es el tipo de cosa que podría razonablemente dar una advertencia (sobre todo en entornos de desarrollo que permiten ajustes de grano muy fino de las advertencias), pero no creo que debería ser un error.
En principio se podría llamar al método foo()
en a
través de la reflexión, por lo que no es siempre inalcanzable.
Trate esto después de a.go();
:
Method m = a.getClass().getDeclaredMethod("foo");
m.invoke(a);
public void go()
{
foo();
System.out.println("reachable - B");
}
public void foo()
{
System.out.println("unreachable - B");
}
Simplemente otra forma de llegar el método foo para usarlo otro método de la clase. Debería haber entendido esto antes de pedir. Lo sentimos.