Android内存泄漏管理说"Don use non-static inner classes"但这会带来副作用



假设我有一个内部类,我把它做成静态的,所以我避免了内存泄漏。现在,这个内部类想要使用主类中的方法,但为了让我做到这一点,我还需要使该方法成为静态方法,因为"你不能在静态上下文中使用非静态方法"。如果我使该方法成为静态的,它使用的字段也应该变成静态的,现在触发了连锁反应,其中所有内容都应该更改为静态,我不喜欢。

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();
    }

}

最新更新