假设我有一个内部类,我把它做成静态的,所以我避免了内存泄漏。现在,这个内部类想要使用主类中的方法,但为了让我做到这一点,我还需要使该方法成为静态方法,因为"你不能在静态上下文中使用非静态方法"。如果我使该方法成为静态的,它使用的字段也应该变成静态的,现在触发了连锁反应,其中所有内容都应该更改为静态,我不喜欢。
public class MyFragment extends Fragment {
private int field1;
private int field2;
private void doSomething() {
field1 + field2;
}
private class CertainListenerImpl implements CertainListener {
@Override
private void onCertainEventsOccurrence() {
doSomething();
}
}
}
如果我将上述代码中的内部类更改为"静态",现在我必须使 doSomething 是静态的,并且 field1 和 field2 也是静态的。
我该怎么办?
非静态类可能会导致对外部类的意外引用。 在您的情况下,您可以传入对外部类的引用,这将使您更清楚地了解您正在做什么,但也会使您的代码更加复杂。 没有错或对,我建议你做你认为不太容易出错的事情。
我必须使doSomething是静态的,并且字段1和字段2也是静态的。
我不会那样做。相反,您可以将MyFragment的实例传递给CertainListenerImpl的构造函数,并将其存储为字段,这就是Java为您所做的。
顺便说一句:这个内部字段被称为 Oracle/OpenJDK 的this$0
,如果你用这个名字创建一个字段,它会称它为 this$$0
或更多的 $$$$
你现在拥有的相当于
private static class CertainListenerImpl implements CertainListener {
private final MyFragment this$0; // rename to taste
CertainListenerImpl(MyFragment myFragment) {
this$0 = myFragment;
}
@Override
private void onCertainEventsOccurrence() {
this$0.doSomething();
}
}