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)保留,实现类在 SomeClass 之外仍然不可用(我认为这是编写嵌套类的唯一合法意图),最后但并非最不重要的一点是您可能还提供以 InterfaceUpdateListener 作为参数的第二个构造函数(如果需要更多的灵活性和可测试性)。并且无需更改警告。

预计

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 回答