迭代器是导出到客户端的嵌套类。那为什么宣布私有而不是公开? 例如:
private abstract class HashIterator<E> implements Iterator<E> {
private final class EntryIterator extends HashIterator<Map.Entry<K,V>> {
public Map.Entry<K,V> next() {
return nextEntry();
}
}
答案 0 :(得分:3)
它隐藏了类用户不需要知道的实现细节。例如HashSet
public Iterator<E> iterator()
Returns an iterator over the elements in this set.
它没有说明返回了哪个具体的迭代器,它是一个对用户不可见的私有类,用户不需要知道实现细节,HashSet设计者可以自由更改实现,恕不另行通知
答案 1 :(得分:2)
在一般情况下,他们不必是私人的;也就是说,如果您正在设计数据结构,那么就没有什么能阻止您将迭代器类声明为public
。
但是,如果数据结构是字符串抽象,则私有迭代器是“好的设计”;即内部表示对客户端代码隐藏的内容。
一个原因是将迭代器类设为私有可以防止不希望的耦合;即它会阻止某些外部类依赖于实际的迭代器代码,从而使未来的代码更改变得更加困难。
另一个原因是,在大多数情况下,无论如何都无法实例化可扩展的公共迭代器类。或者至少,不要放松数据结构的抽象边界。
另一种看待这种情况的方法是使迭代器类public
无法实现。除了Iterator
API中的方法之外,调用者通常不需要使用任何其他内容。如果确实如此,则解决方案是扩展迭代器API(接口)以提供其他方法。
答案 2 :(得分:0)
有很多原因和警告:
private
不允许客户依赖实际实施interface
,因为它不允许您转换为实际的实现,因为它是private
class
仅对parent class
有用,其他代码不应依赖于此