内部类应该在哪里实例化?

时间:2014-12-10 07:43:40

标签: java inner-classes

我见过两种实例化内部类的方法。例如

class OuterClass{
    private int x = 23;

    class InnerClass{
        public void printX(){
            System.out.println(x);
        }
        public void printStuff(){
            System.out.println("This is an inner class method");
        }

    }
}

public class TestMain321{
    public static void main(String[] args){
        OuterClass o = new OuterClass();
        OuterClass.InnerClass i = o.new InnerClass();
        i.printX();
    }
}

class OuterClass{
    private int x = 23;
    InnerClass i = new InnerClass();
    public void innerMethod(){
        i.printX();
    }

    class InnerClass{
        public void printX(){
            System.out.println(x);
        }
        public void printStuff(){
            System.out.println("This is an inner class method");
        }

    }
}

public class TestMain123{
    public static void main(String[] args){
        OuterClass o = new OuterClass();
        o.innerMethod();
        i.printStuff();//WON'T COMPILE

    }
}

第一个例子,我可以直接调用内部类方法,因为我在main()中实例化内部类

OuterClass.InnerClass i = o.new InnerClass();
i.printX();

不同之处在于,在第二个例子中,我直接在外部类中实例化内部类,所以稍后在main方法中我不能直接调用内部类的方法,因为它不知道引用。我必须创建一个外部类方法来调用内部类方法,例如,请参阅外部类中的innerMethod()。

public void innerMethod(){
            i.printX();
        }

我还有其他原因可以实现一种方式吗?有关如何做到这一点的最佳做法吗?

1 个答案:

答案 0 :(得分:4)

您的内部类应该始终是私有的,以防止外部访问,除了外部类。 Effective Java Book和此question中提到了这一点。

  1. “内部类应该只存在于服务于它的外部类。”
  2. 如果你的内部阶级需要公开,那么认真考虑将其作为正常的阶级而不是内部阶级。