为什么安卓更喜欢静态类

2022-09-01 02:47:47

我看到很多java代码,android更喜欢让开发人员使用静态内部类。特别是对于自定义 ListAdapters 中的 ViewHolder Pattern 等模式。

我不确定静态和非静态类之间的区别是什么。我已经读过它,但是在考虑性能或内存占用时似乎没有意义。


答案 1

这不仅仅是安卓开发者...

非静态内部类始终保留对封闭对象的隐式引用。如果您不需要该引用,它所做的就是消耗内存。请考虑以下情况:

class Outer {
    class NonStaticInner {}
    static class StaticInner {}
    public List<Object> foo(){ 
        return Arrays.asList(
            new NonStaticInner(),
            new StaticInner()); 
    }
}

当你编译它时,你得到的将是这样的:

class Outer {
    Outer(){}
    public List<Object> foo(){ 
        return Arrays.asList(
            new Outer$NonStaticInner(this),
            new StaticInner()); 
    }
}
class Outer$NonStaticInner {
    private final Outer this$0;
    Outer$NonStaticInner(Outer enclosing) { this$0 = enclosing; }
}
class Outer$StaticInner {
    Outer$StaticInner(){}
}

答案 2

静态和非静态内部类之间的主要区别在于,非静态内部类可以访问外部类的其他成员,即使它们是私有的。非静态内部类是外部类的“一部分”。如果没有外部类的实例,则无法创建它们,也不能存在它们。这样做的结果是,当外部类的实例被销毁时,非静态内部类的实例将被销毁。

另一方面,静态内部类与普通的外部类一样。他们自己生死。不需要外部类的实例即可使内部类存在。这意味着他们也有自己的生命周期。当垃圾收集器决定销毁它们时,它们会被摧毁。

这对内存和/或性能有何影响?我真的不知道。:)


推荐