Domanda

compilatore Java si lamenta quando si scrive un codice che non è raggiungibile. Ad esempio

public void go()
{
    return;
    System.out.println("unreachable");
}

Tuttavia, quando si definisce un nuovo metodo in una classe anonima, che non può essere raggiunto da qualsiasi luogo, compilatore non si lamenta. Esso permette di fare questo, perché? Ad esempio,

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
  }
}
È stato utile?

Soluzione

Prima di tutto: Eclipse non notificare mia che foo() non viene mai utilizzato localmente. E 'un avvertimento e non un errore, tuttavia, per motivi sottolineato dagli altri anserws.

Si noti che non v'è un modo per raggiungere foo():

new A() {
      public void go()
      {
        System.out.println("reachable - B");
      }
      public void foo()
      {
        System.out.println("unreachable - B");
      }
}.foo();

Questo funziona, perché il tipo di new A() {} espressione non A, ma in realtà la sottoclasse anonima di A. E che sottoclasse ha un metodo foo pubblico.

Dal momento che non si può avere una variabile con lo stesso tipo, è possibile foo() non l'accesso in questo modo da una variabile.

Altri suggerimenti

Questo è equivalente solo che permette di creare metodi privati ??che non sono chiamati in qualsiasi parte della classe, davvero. Non è il codice irraggiungibile in tutto allo stesso senso -. E potrebbero sono accessibili dalla riflessione

E 'il tipo di cosa che potrebbe ragionevolmente dare un avvertimento (in particolare su IDE che permettono tweaking molto a grana fine di avvertimenti), ma non credo che dovrebbe essere un errore.

In linea di principio si potrebbe chiamare il metodo foo() su a attraverso la riflessione, quindi non è sempre irraggiungibile.

Prova questo dopo 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");
}

semplicemente un altro modo per raggiungere il metodo foo per usarlo un altro metodo della classe. Avrei dovuto capito prima di chiedere. Siamo spiacenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top