【问题标题】:why can I instantiate outer class with a private constructor from a static inner class? [duplicate]为什么我可以使用来自静态内部类的私有构造函数来实例化外部类? [复制]
【发布时间】:2020-06-23 14:51:09
【问题描述】:

类 Singleton 的实例将在方法 getInstance() 被调用时被实例化。我想知道为什么我可以从静态内部类中实例化外部类?

public class Singleton{
   private Singleton(){}

   private static class SingletonHolder{
      private static Singleton INSTANCE = new Singleton();
   }

   public static Singleton getInstance(){
      return SingletonHolder.INSTANCE;
   }
}

【问题讨论】:

  • 因为private只表示在这个类中,而内层外层。
  • (在这个 outer 类中。有一些奇怪的边缘情况,但如果你正在做一些肮脏的事情,它们就是边缘情况。我忘记了它们是什么。)另外,我可以制作那个“单例”(一种反模式)的实例。单持有者反模式几乎总是适得其反——类是延迟加载的,你只是增加了更多的工作和更多的混乱。而且,最重要的是,对全局状态说不。

标签: java


【解决方案1】:

来自JLS 6.6.1

否则,成员或构造函数被声明为私有,并且当且仅当它出现在包含成员或构造函数声明的顶级类型(第 7.6 节)的主体内时才允许访问。

您的访问发生在包含私有构造函数声明的顶级类型的主体内,因此允许访问。


所以,虽然你有什么是允许的,但这不会是:

public class Singleton{
   private Singleton(){}
   // ..
}

// Second top-level class in same file.
class Foo {
  Singleton s = new Singleton();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多