内部クラスが private の場合、外部クラスの外部から名前でアクセスすることはできません。内部クラスと外部クラスは、互いのプライベート メソッドとプライベート インスタンス変数にアクセスできます。内部または外部クラス内にいる限り、修飾子 public と private は同じ効果があります。あなたのコード例では:
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
public boolean hasNext() { // Why public?
// ...
}
}
}
クラス DataStructure に関する限り、これは次のものと完全に同等です。
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
private boolean hasNext() {
// ...
}
}
}
これは、DataStructure のみがアクセスできるためであり、パブリックまたはプライベートのどちらに設定しても問題ありません。いずれにせよ、DataStructure は依然としてそれにアクセスできる唯一のクラスです。どちらの修飾子を使用しても、機能的な違いはありません。無作為に選択できないのは、実装または拡張するときだけです。この場合、アクセスを減らすことはできませんが、増やすことはできます。したがって、抽象メソッドがアクセスを保護している場合は、それをパブリックに変更できます。確かに、どちらも実際には違いはありません。
他のクラスで内部クラスを使用することを計画している場合、それをパブリックにする場合は、そもそもそれを内部クラスにするべきではありません。
さらに、他のクラスを拡張または実装する内部クラスの要件は見当たりません。そうするのが一般的かもしれませんが、必須ではありません。