5

次のコードがあります。

public class SomeClass {
   //InterfaceUpdateListener is an interface
   private InterfaceUpdateListener listener = new InterfaceUpdateListener(){
        public void onUpdate() {
           SomeClass.this.someMethod();  //complier complains on this line of code
        }
   };

   private void someMethod() {
     //do something in here on an update event occuring
   }

   //other code to register the listener with another class...
}

私のEclipseのコンパイラは、

Access to enclosing method 'someMethod' from type SomeClass is emulated by a synthetic accessor method.

誰か正確に説明してくれませんか

  1. これが何を意味するか、
  2. そのままにしておくと(警告にすぎないため)、考えられる影響が何を意味するのか、および
  3. どうすれば修正できますか?

ありがとう

4

2 に答える 2

4

ルールを無効にするだけです (つまり、コンパイラがこれに対して警告を生成しないようにします)。構造が合法であり、それをサポートするためにコンパイラによって追加のメソッドが追加されている場合は、それが実行されなければならない方法です。

この合成方法によってパフォーマンスが大幅に低下することはないと思います。JIT は、必要に応じてインライン化する必要があります。

于 2011-08-12T21:48:56.470 に答える
2

これはどう?JVM (PermGen) で保持する必要があるクラス宣言は 1 つだけです。実装クラスは SomeClass の外ではまだ使用できません (ネストされたクラスを作成する唯一の法的意図はこれだと思います)。引数として InterfaceUpdateListener を持つ 2 番目のコンストラクター (柔軟性とテスト容易性のために必要な場合)。また、警告を変更する必要はありません。

予想

public interface InterfaceUpdateListener {
    public void onUpdate();
}

が提供されている場合、 SomeClass は次のように実装される場合があります

public class SomeClass {
   //InterfaceUpdateListener is an interface
   private final InterfaceUpdateListener listener;
   private static class SomeClassInterfaceUpdateListener implements InterfaceUpdateListener {
       private final SomeClass internal;
       public SomeClassInterfaceUpdateListener(final SomeClass aSomeClass) {
           internal = aSomeClass;
       }
       @Override
       public void onUpdate() {
           internal.someMethod();  //complier complains on this line of code
       }
   }
   public SomeClass() {
       listener =  new SomeClassInterfaceUpdateListener(this);
   }
   private void someMethod() {
     //do something in here on an update event occuring
   }
}
于 2012-09-28T16:36:24.040 に答える