使用Java将内部类设置为静态有什么好处?

时间:2013-04-22 12:42:30

标签: java class findbugs

我的Java类中有一个内部类。

enter image description here

当我运行find bugs时,它建议(警告)将其设为静态。

enter image description here

这个警告有什么意义?将内部类设为静态有什么好处?

6 个答案:

答案 0 :(得分:25)

如果嵌套类不访问封闭类的任何变量,则可以将其设置为静态。这样做的好处是您不需要外部类的封闭实例来使用嵌套类。

答案 1 :(得分:10)

默认情况下,内部类具有对外部类的对象的隐式引用。如果你从外部类的代码中实例化了这个对象,那么这一切都是为你完成的。如果您不这样做,则需要自己提供该对象。

静态内部类没有这个。

这意味着它可以在外部类对象的范围之外实例化。这也意味着如果你'导出'内部类的一个实例,它将不会阻止收集当前对象。

作为一项基本规则,如果内部类没有理由访问外部类,则默认情况下应将其设置为静态。

答案 2 :(得分:3)

非静态内部类具有对外部类的隐式引用。如果将类设置为静态,则可以节省一些内存和代码。

答案 3 :(得分:2)

静态内部类是一种语义上更简单的东西。它就像一个顶级课程,除了你有更多的可见性选项(例如你可以把它变成私人)。

避免非静态内部类的一个重要原因是它们更复杂。有外部类的隐藏引用(甚至可能不止一个)。在内部类的方法中,一个简单的名称现在可以是三个内容之一:本地,字段或外部类的字段。

这种复杂性的工件是对外部类的隐藏引用可能导致内存泄漏。假设内部类是一个监听器,可以是一个静态内部类。只要监听器被注册,它就会保存对外部类实例的引用,而外部类的实例又可以保留大量内存。使侦听器静态可能允许外部实例被垃圾收集。

答案 4 :(得分:0)

我们已经有了很好的答案,这是我的5美分:

当我们需要使用外部类的方法和变量来分离逻辑功能时,使用静态和非静态内部类。两个内部类都可以访问外部类的私有变量。

静态内部类的优点: 1)静态类可以从外部类访问静态变量 2)静态类可以像独立的类一样对待

非静态内部阶级: 1)不能使用外部类的静态成员 2)不能像独立的阶级一样对待

public class NestedClassDemo {
    private int a = 100;
    int b = 200;
    private static int c = 500;

    public NestedClassDemo() {
        TestInnerStatic teststat = new TestInnerStatic();
        System.out.println("const of NestedClassDemo, a is:"+a+", b is:"+b+".."+teststat.teststat_a);
    }

    public String getTask1(){
        return new TestInnerClass().getTask1();
    }

    public String getTask2(){
        return getTask1();
    }


    class TestInnerClass{
        int test_a = 10;

        TestInnerClass() {
            System.out.println("const of testinner private member of outerlcass"+a+"..."+c);
        }
        String getTask1(){
            return "task1 from inner:"+test_a+","+a;
        }
    }

    static class TestInnerStatic{
        int teststat_a = 20;

        public TestInnerStatic() {
            System.out.println("const of testinnerstat:"+teststat_a+" member of outer:"+c);
        }

        String getTask1stat(){
            return "task1 from inner stat:"+teststat_a+","+c;
        }
    }

    public static void main(String[] args){
        TestInnerStatic teststat = new TestInnerStatic();
        System.out.println(teststat.teststat_a);
        NestedClassDemo nestdemo = new NestedClassDemo();
        System.out.println(nestdemo.getTask1()+"...."+nestdemo.getTask2());
    }
}

从外部访问静态内部和非静态内部类:

public class TestClass {
    public static void main(String[] args){
        NestedClassDemo.TestInnerClass a = new NestedClassDemo().new TestInnerClass();
        NestedClassDemo.TestInnerStatic b = new NestedClassDemo.TestInnerStatic();
    }
}

可以在https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

找到静态内部类的官方java文档

答案 5 :(得分:0)

静态内部类的优点: 1.静态内部类的实例化不依赖外部类的指导,并且实例化的内存开销 2.静态内部类不持有外部类的指导,不影响外部类的收集,避免外部类在内存生存时间上的延长导致内存泄漏