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
  }
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top