日期:2014-05-20  浏览次数:20820 次

静态内部类的优点
对于静态内部类 我能想到的只有 获取内部类的实例无需有外部类实例的引用 。

被问及到一个问题 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
------解决方案--------------------
这个静态内部类,不需要在外部引用,只为当前类提供服务。 封装的完整性。
------解决方案--------------------
写的都很好
------解决方案--------------------
这些内部的东西不是具体涉及到了,过短时间来看还真有点忘记了。 看来要多巩固啊、