2011-01-21 7 views
2

到達不能なコードを記述すると、Javaコンパイラがエラーを発する。たとえば、java匿名の内部クラス到達不能コード

ただし、どこからでもアクセスできない匿名クラスに新しいメソッドを定義すると、コンパイラは不平を言っていません。それはあなたがそれを可能にします、なぜですか?原則として 例えば、

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 
    } 
} 
+0

匿名の内部クラスの宣言を終了するには、 'new A 'の後にカッコ'() 'と中括弧'};がありません。 – Jesper

+0

サンプルコードはまったくコンパイルされません。正してください。 – PeterMmm

+0

私はそれをB.javaファイルにコピーし、a.foo()という行にコメントを付けてコンパイルして実行しました。申し訳ありませんが、コンパイルエラーの原因となることが既に述べられているa.foo()の部分を除いて、コードにエラーはありませんでした。 – kioto

答えて

5

まず第一に:Eclipseのfoo()はローカルで使用されないことを私に通知しません。しかし、それは警告であり、他のアンサーによって指摘された理由から間違いではありません。

foo()に到達するための方法があること

注:表現new A() {}の種類がAではなく、実際にAの匿名のサブクラスであるため、

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

これは動作します。そのサブクラスには、公開fooメソッドがあります。

同じタイプの変数を使用することはできませんので、変数からfoo()にアクセスすることはできません。

+0

ありがとうございます。メソッドを呼び出すための非常に良い方法です。内部クラスは非常に興味深いプロパティを持っています – kioto

4

それは常に到達できないので、あなたは、リフレクション経由afoo()メソッドを呼び出すことができます。

a.go();後にこれを試してみてください:

あなたは本当に、クラスのどこに呼び出されないプライベートメソッドを作成することを可能にするだけに同等だ
Method m = a.getClass().getDeclaredMethod("foo"); 
m.invoke(a); 
+1

JSP/FaceletsのEL言語だけでなく、 –

+0

ありがとうございます。あなたが正しいです。しかし、私は、リフレクションによって匿名の内部クラスのメソッドに到達することは理にかなっていないと思います。しかし、他の答えで述べたように、それに到達する他の方法があります。 – kioto

+0

@kioto、それは*意味があるかどうかは関係ありませんが、重要なのは*可能です*。ヨアキムの答えは確かに良いです。 – Jesper

5

。それはまったく同じ意味で到達不能なコードではありません。に反映されます。

これは警告を合理的に(特に非常にきめ細かな警告の調整を可能にするIDE上で)与えるかもしれないものですが、エラーではないと思います。

+0

ありがとうございます、あなたも正しいです。内部クラスの別のメソッド内でそのメソッドにアクセスすることができます。私は今参照してください。 – kioto

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

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

fooメソッドに到達するための別の方法は、クラスの別のメソッドを使用することです。私は尋ねる前にこれを理解していたはずです。ごめんなさい。

関連する問題