内部类应该在哪里实例化?
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 中提到。
-
“一个内部类的存在应该只为它的外部类服务。”
如果您的内部类需要公开,请认真考虑将其设为普通类而不是内部类。
【讨论】:
以上是关于内部类应该在哪里实例化?的主要内容,如果未能解决你的问题,请参考以下文章