为什么迭代器是私有的?

时间:2013-09-04 04:20:19

标签: java iterator

迭代器是导出到客户端的嵌套类。那为什么宣布私有而不是公开? 例如:

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();
        }
    }

3 个答案:

答案 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有用,其他代码不应依赖于此
  • 实际实施可以随时更改,恕不另行通知Java团队,如其他答案中所述。