【问题标题】: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 根据您的经验有什么具体原因吗?
  • 更多控制在外部类,防止错误使用

标签: java inner-classes


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 2016-10-25
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2022-10-05
    • 2011-05-03
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多