当前位置: 代码迷 >> J2SE >> 静态内部类的优点解决方法
  详细解决方案

静态内部类的优点解决方法

热度:167   发布时间:2016-04-24 02:17:15.0
静态内部类的优点
对于静态内部类 我能想到的只有 获取内部类的实例无需有外部类实例的引用 。

被问及到一个问题 ConcurrentHashMap 中HashEntry 为什么被设置为静态内部类。  
我感觉应该是为了在发布 HashEntry 的时候不会发布ConcurrentHashMap的this 引用。 但是这样做目的是什么。。。为了并发更安全? 


求大神解释  


------解决方案--------------------
Java code
//理解有误区,ConcurrentHashMap发布访问时并不是发布静态内部类HashEntry,反而是封装了HashEntry的非//静态final内部类KeySet Values EntrySet, 这3个类分别封装了KeyIterator ValueIterator// EntryIterator//你可以看一看源代码, HashEntry 其实很简单。ConcurrentHashMap并不会直接发布它 他也不是一个//实现了Map.Entry接口的类什么的。 因为它只是一个工具类辅助ConcurrentHashMap里的final非静态内部类//KeyIterator ValueIterator EntryIterator,这几个类才是真正被发布的要访问ConcurrentHashMap的非静//态属性和方法的的内部类。//所以得出结论,为了更高的内部聚合,访问最严格性,HashEntry既然是一个工具类不需要访问//ConcurrentHashMap的一些信息,使它的访问域最小就可以用上静态内不类    /**     * ConcurrentHashMap list entry. Note that this is never exported     * out as a user-visible Map.Entry.     *     * Because the value field is volatile, not final, it is legal wrt     * the Java Memory Model for an unsynchronized reader to see null     * instead of initial value when read via a data race.  Although a     * reordering leading to this is not likely to ever actually     * occur, the Segment.readValueUnderLock method is used as a     * backup in case a null (pre-initialized) value is ever seen in     * an unsynchronized access method.     */    static final class HashEntry<K,V> {        final K key;        final int hash;        volatile V value;        final HashEntry<K,V> next;        HashEntry(K key, int hash, HashEntry<K,V> next, V value) {            this.key = key;            this.hash = hash;            this.next = next;            this.value = value;        }    @SuppressWarnings("unchecked")    static final <K,V> HashEntry<K,V>[] newArray(int i) {        return new HashEntry[i];    }    }
------解决方案--------------------
静态内部类的作用,除了楼主说的“实例化无需外部类实例”以外,还有:静态内部类可以在外部类的静态上下文(如 static 方法、static 块或静态成员定义)中使用。
------解决方案--------------------
除了楼上所说的,还有静态内部类只能访问外部类的静态属性和方法,(封装带来的安全)这是与一般内部类的区别,而且静态内部类还可以有静态数据,静态方法或者又一个静态内部类,这些是非静态内部类所没有的。
------解决方案--------------------
因为静态内部类独立存在,为外部类提供一种处理方法。
ConcurrentHashMap中HashEntry又是多线程共享的,static更合适。
------解决方案--------------------
这个应该结合内部类和静态类一起考虑吧。
静态类的特点就是,所有的属性和方法都是静态的。
------解决方案--------------------
以上说的差不多了!
------解决方案--------------------
下班咯。。为美女顶上一刷子。。。我没有什么说的。。。观望。。。。
------解决方案--------------------
美女程序员!
------解决方案--------------------
如果内部类不会引用到外部类东西的话,强烈建议使用静态内部类,因为这样更节省资源,减少内部类其中的一个指向外部类的引用,详见 effective java
------解决方案--------------------
这个静态内部类,不需要在外部引用,只为当前类提供服务。 封装的完整性。
------解决方案--------------------
写的都很好
------解决方案--------------------
这些内部的东西不是具体涉及到了,过短时间来看还真有点忘记了。 看来要多巩固啊、
  相关解决方案