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

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

public class DataStructure { // ... private class InnerEvenIterator { // ... public boolean hasNext() { // Why public? // ... } } } 

如果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; } } 

尽管编译器在这种特定情况下不强制执行可见性规则,但是可以将此方法public以表明它在语义上是公共的。

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

实现任何interface时都很有用。

 class DataStructure implements Iterable { @Override public Iterator iterator() { return new InnerEvenIterator(); } // ... private class InnerEvenIterator implements Iterator { // ... 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 ids = ds.iterator(); ids.hasNext(); // accessable } } 

我认为您缺少在示例代码中实现Iterator接口部分。 在这种情况下,您不能使hasNext()方法具有除public之外的任何其他可见性标识符,因为这最终会降低其可见性(接口方法具有公共可见性)并且它将无法编译。

存在许多无用的访问修饰符组合。 私有内部类中的公共方法仅在公共类/接口中实现公共方法时才有用。

 public class DataStructure { // ... private class InnerEvenIterator implements Iterator { // ... public boolean hasNext() { // Why public? // ... } } public Iterator iterator() { return new InnerEvenIterator(); } } 

顺便说一句:抽象类通常具有public构造函数,实际上它们protected

如果内部类是私有的,则不能通过外部类之外的名称来访问它。 内部类和外部类可以访问彼此的私有方法和私有实例变量。 只要您在内部或外部类中,公共和私有修饰符具有相同的效果。 在您的代码示例中:

 public class DataStructure { // ... private class InnerEvenIterator { // ... public boolean hasNext() { // Why public? // ... } } } 

就类DataStructure而言,这完全等同于:

 public class DataStructure { // ... private class InnerEvenIterator { // ... private boolean hasNext() { // ... } } } 

这是因为只有DataStructure可以访问它,因此如果将其设置为public或private则无关紧要。 无论哪种方式,DataStructure仍然是唯一可以访问它的类。 使用你喜欢的任何修改器,它没有任何function差异。 您无法随意选择的唯一时间是您实施或扩展时,在这种情况下您无法减少访问权限,但您可以增加它。 因此,如果抽象方法具有受保护的访问权限,则可以将其更改为public。 当然,没有人真正有任何区别。

如果您计划在其他类中使用内部类,并因此将其公开,那么您可能不应该首先将其作为内部类。

另外,我没有看到内部类扩展或实现其他类的任何要求。 他们这样做可能很常见,但肯定不是必需的。