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

Java 内部类应该在哪里实例化?,java,inner-classes,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 me

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

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

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

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

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

有没有其他理由让我用一种方法来实现另一种方法?是否有关于如何做到这一点的最佳实践

您的内部类应该始终是私有的,以防止外部类之外的外部访问。 这在和中提到

  • “一个内部阶级的存在应该只为其外部阶级服务。”

  • 如果您的内部类需要公开,请认真考虑将其本身作为正常类,而不是内部类。 我觉得第二条路更好。添加私有构造函数以防止第一种方法。@StanislavL根据您的经验有什么具体原因吗?在外部类中有更多的控制,以防止不正确的使用

    OuterClass.InnerClass i = o.new InnerClass();
    i.printX();
    
    public void innerMethod(){
                i.printX();
            }