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

Posted

技术标签:

【中文标题】内部类应该在哪里实例化?【英文标题】:where should inner classes be instantiated? 【发布时间】:2014-12-10 07:43:40 【问题描述】:

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

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

还有什么其他原因让我实施一种方式而不是另一种方式?是否有关于如何做到这一点的最佳实践?

【问题讨论】:

恕我直言,第二种方式更好。添加私有构造函数以防止第一种方法。 @StanislavL 根据您的经验有什么具体原因吗? 更多控制在外部类,防止错误使用 【参考方案1】:

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

    “一个内部类的存在应该只为它的外部类服务。”

如果您的内部类需要公开,请认真考虑将其设为普通类而不是内部类。

【讨论】:

以上是关于内部类应该在哪里实例化?的主要内容,如果未能解决你的问题,请参考以下文章

在静态方法中new 一个内部类对象和new 一个外部类对象的区别

java 内部类

(转)Java静态内部类的实例化问题

动态实例化嵌套在抽象类中的内部类

内部类实例化Serializable

《java基础知识》Java内部类及其实例化