关于jdk nio SelectionKey的一些问题

Some questions about jdk nio SelectionKey

最近,我在阅读jdk 1.8 nio 源代码时遇到了问题。我想知道这两个属性之间有什么区别?根据我的查询,有人说publicKeys是对keys的proxy enhancement,但是我发现可以给keys添加元素,但是publicKeys是不可变的,这个应该怎么理解。

public abstract class SelectorImpl extends AbstractSelector {
    protected HashSet<SelectionKey> keys = new HashSet();
    private Set<SelectionKey> publicKeys;

    
}

假设您指的是 sun.nio.ch.SelectorImplpublicKeys 被声明为私有并在构造函数中按如下方式分配: publicKeys = Collections.unmodifiableSet(keys).

看看 Collections#unmodifiableSet(Set) 我们看到这提供了对其参数的“只读”访问。它的行为不像复制构造函数,即复制元素引用并在调用该方法时提供原始元素的静态视图。相反,它提供了原始的动态 Set 视图,其中所有 Set 修改方法(例如 addclear)都会抛出异常。