为什么要在Java中公开私有内部类成员?

vit*_*aut 32 java access-specifier private-members public-members

如果在包含类之外仍然无法访问Java中私有内部类公共成员的原因是什么?或者可以吗?

public class DataStructure {
    // ...

    private class InnerEvenIterator {
        // ...

        public boolean hasNext() { // Why public?
            // ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Gur*_*oca 32

如果InnerEvenIterator类没有扩展任何类或实现任何接口,我认为这是无稽之谈,因为没有其他类可以访问它的任何实例.

但是,如果它扩展或实现任何其他非私有类或接口,它是有道理的.一个例子:

interface EvenIterator {
    public boolean hasNext();
}


public class DataStructure {
    // ...

    private class InnerEvenIterator implements EvenIterator{
        // ...

        public boolean hasNext() { // Why public?
            // ...
        }
    }

    InnerEvenIterator iterator;

    public EvenIterator getIterator(){
         return iterator;
    }     

}
Run Code Online (Sandbox Code Playgroud)


axt*_*avt 15

public尽管编译器在这种特定情况下不强制执行可见性规则,但可以使用此方法来指示它在语义上是公共的.

想象一下,在一些重构过程中,你需要让这个内部类成为顶级.如果这种方法是private,您将如何决定是否应该制作public,或者应该使用一些更严格的修饰符?声明方法public告诉读者原作者的意图 - 这种方法不应被视为实现细节.

  • 这正是我在嵌套类中使用public和private的方式!为什么我们使用可以从外部调用的私有方法以不同的方式编写嵌套类?我一般认为外部类不应该调用内部类中的私有方法,只能调用公共方法,即使编译器不强制执行此操作.作为奖励,您可以稍后将嵌套类重构为顶级类,而无需将私有方法更改为public. (5认同)

Pri*_*ley 8

实现任何一个都很有用interface.

class DataStructure implements Iterable<DataStructure> {

    @Override
    public Iterator<DataStructure> iterator() {
        return new InnerEvenIterator();
    }
    // ...        

    private class InnerEvenIterator implements Iterator<DataStructure> {
        // ...    
        public boolean hasNext() { // Why public?
            // ...
            return false;
        }

        @Override
        public DataStructure next() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }

    public static void main(String[] ex) {
        DataStructure ds = new DataStructure();
        Iterator<DataStructure> ids = ds.iterator();
        ids.hasNext(); // accessable            
    }
}
Run Code Online (Sandbox Code Playgroud)