3

迭代器是导出到客户端的嵌套类。那么为什么声明为 private 而不是 public ?例如:

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

3 回答 3

3

它隐藏了类用户不需要知道的实现细节。例如哈希集

public Iterator<E> iterator() 

Returns an iterator over the elements in this set. 

它没有说明返回哪个具体的Iterator,它是一个对用户不可见的私有类,用户不需要知道实现细节,HashSet 设计者可以随意更改实现,恕不另行通知

于 2013-09-04T04:31:48.133 回答
2

在一般情况下,它们不必是私有的。即,如果您正在设计一个数据结构,没有什么能阻止您将迭代器类声明为public.

但是,如果数据结构旨在成为字符串抽象,则私有迭代器是“好的设计”;即内部表示对客户端代码隐藏的一种。

一个原因是,将迭代器类设为私有可以防止不必要的耦合。即,它会阻止某些外部类依赖于实际的迭代器代码,这会使未来的代码更改更加困难。

另一个原因是在大多数情况下,无论如何都无法实例化可扩展的公共迭代器类。或者至少,在不放宽数据结构的抽象边界的情况下并非如此。


另一种看待这一点的方法是,制作迭代器类public不会取得任何成果。Iterator除了API中的方法,调用者通常不需要使用任何东西。如果是这样,那么解决方案是扩展迭代器 API(接口)以提供额外的方法。

于 2013-09-04T04:46:14.120 回答
0

有很多原因和注意事项:

  • 保持类private不会让客户依赖于实际的实现
  • 保持代码松散耦合
  • 它严格将代码应用于 ainterface因为它不允许您转换为实际实现,因为它是private
  • 它在逻辑上强调class仅对 有用,parent class其他代码不应依赖于
  • 如其他答案中所述,实际实现可以随时更改,无需 Java 团队通知。
于 2013-09-04T06:03:31.877 回答