为什么ConcurrentHashMap.Segment和ConcurrentHashMap.HashEntry类是静态的?

时间:2013-11-21 15:10:26

标签: java design-patterns concurrency

为什么ConcurrentHashMap.SegmentConcurrentHashMap.HashEntry类是静态的? 为什么这样设计?

4 个答案:

答案 0 :(得分:6)

基本上所有不需要使用其封闭类的属性的内部类都应该是static。这来自java中的一般原则,它说每个对象都应该可以访问尽可能少的其他对象。

答案 1 :(得分:2)

每个内部非静态类都包含一个不可见字段this$,它引用它的父对象(ConcurrentHashMap),它为每个实体创建一个8字节的开销(Segment或{{1} })。这就是父类的类字段的访问方式 - 内部类在某种情况下是属于单个容器(例如父类)的对象的语法糖。

这就是为什么在可能的情况下应该用静态内部类替换内部类。

答案 2 :(得分:1)

答案 3 :(得分:0)

内部静态类有一个漂亮的功能,它们是延迟加载,正如我们实现单例模式时在Bill Pugh Singleton实现中所解释的那样。

静态内部类提供的其他功能是外部实例变量不可访问。从这里开始,我们也无法访问非静态方法。没有必要创建单独的实例来初始化该静态类,直接使用ClassName.InnerStaticClass.method(),可以调用该方法。