为什么要在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。 当然,没有人真正有任何区别。
如果您计划在其他类中使用内部类,并因此将其公开,那么您可能不应该首先将其作为内部类。
另外,我没有看到内部类扩展或实现其他类的任何要求。 他们这样做可能很常见,但肯定不是必需的。