代码之家  ›  专栏  ›  技术社区  ›  Vivin Paliath

使用列表还是集合更好?

  •  35
  • Vivin Paliath  · 技术社区  · 15 年前

    public List<SomeDataType> getData() {
       return this.data;
    }
    
    public void setData(List<SomeDataType> data) {
       this.data = data;
    }
    

    这是否意味着我允许内部实现细节泄露出去?我应该这样做吗?

    public Collection<SomeDataType> getData() {
       return this.data;
    }
    
    public void setData(Collection<SomeDataType> data) {
       this.data = new ArrayList<SomeDataType>(data);
    }
    
    8 回复  |  直到 15 年前
        1
  •  26
  •   Matt H    15 年前

    这取决于,你希望你的用户能够索引到数据中吗?如果是,请使用列表。两者都是接口,所以您不会泄露实现细节,实际上,您只需要确定所需的最低功能。

        2
  •  19
  •   Shikhar Mishra    15 年前

    返回集合会给用户造成歧义,因为返回的集合可以是Set、List或Queue。

        3
  •  10
  •   Brian M. Carr    15 年前

        4
  •  8
  •   Jay    15 年前

    当返回高层次结构中的接口或类的实现时,经验法则是,声明的返回类型应该是最高级别,它提供您准备好向调用者保证的最低功能,并且调用者合理地需要这些功能。例如,假设您真正返回的是ArrayList。ArrayList实现列表和集合(以及其他功能)。如果您希望调用者需要使用get(intx)函数,那么返回集合将不起作用,您需要返回List或ArrayList。只要您不明白为什么要将实现更改为使用列表以外的内容(比如一个集合),那么正确的答案就是返回一个列表。我不确定ArrayList中是否有任何函数不在列表中,但如果有,同样的推理也适用。另一方面,一旦您返回了一个列表而不是一个集合,您现在已经在某种程度上锁定了实现。在API中放得越少,对未来改进的限制就越少。

        5
  •  5
  •   Alb    15 年前

    除非有明确的理由使用更具体的类型列表,否则使用最通用的类型Collection是最有意义的。但是不管你做什么,如果这是一个公共消费的API,那么在文档中要清楚它是做什么的;如果它返回一个收藏的浅拷贝,那么就这样说。

        6
  •  1
  •   EMP    15 年前

    是的,如果方法总是返回一个列表,那么您的第一个替代方法不会泄漏实现细节。另外,允许用户代码替换集合实例有些危险,因为它们传入的实现可能不会像您期望的那样工作。

    当然,这完全取决于你对用户的信任程度。如果你接受Python的哲学“我们都是同意的成年人”,那么第一种方法就是好的。如果您认为您的库将被没有经验的开发人员使用,并且您需要尽一切努力来“看护”他们,确保他们不会做错什么,那么最好不要让他们设置集合,甚至不要返回实际的集合。相反,返回它的(浅)副本。

        7
  •  0
  •   Michael Aaron Safyan    15 年前

        8
  •  -1
  •   Cyberherbalist    15 年前

    如果我担心向外部用户隐藏数据的内部表示,我会使用XML或JSON。不管怎样,它们都是相当普遍的。