编程到接口,泛型如何过于通用?

时间:2009-06-11 18:07:10

标签: language-agnostic oop interface

返回对象时,我想要在多长时间内备份​​实现层次结构?

使用Java集合接口作为示例,这是否合适?

Collection outerMethod() {
    return innerMethod();
}

List innerMethod() {
    List list = new ArrayList();
    //do something with the list that requires a method in the List interface
    return list;
}

或者您想使用List作为外部方法的返回值吗?

另一个例子,

List outerMethod() {
    List list = innerMethod();
    //do something with the list that requires a method in the List interface
    return list;
}

Collection innerMethod() {
    return new ArrayList();
}

带参数的示例

void outerMethod() {
    innerMethod((List) innerMethodTwo);
}

void innerMethodOne(List list) {
    //do something with the list
}

Collection innerMethodTwo() {
    return new ArrayList();
}

任何人都可以提供任何一般性建议吗?

3 个答案:

答案 0 :(得分:6)

您的退货类型应尽可能具体,以便为您的方法的消费者提供最大的灵活性。本着同样的精神,最佳做法是将任何参数的类型设置为尽可能抽象,以便您的方法的使用者在可以传递的类型方面具有更大的灵活性。

答案 1 :(得分:5)

我发现从类中公开类型时具体的问题的答案取决于您的期望限制,以了解调用者如何与之交互您的班级以及您的代码可能如何发展。这是一个复杂的平衡行为。

例如,如果您希望调用者需要按索引访问元素,则可以返回List,但如果没有,则Collection可能就足够了。如果您希望限制调用者只能迭代结果而不更改它们 - 您希望返回Iterable<>包装器。如果您知道您的内部表示可能会发生变化,您可能希望避免返回像List这样的特定类,以便消费者可以更加脱离您的实现。

回答这些问题并不容易 - 没有正确或错误的答案 - 也没有完美的指导方针。它需要经验,思想和直觉。而且(像我们大多数人一样),你可能会弄错。

我要说的是,就个人而言,我错误地认为我在代码中暴露的内容更加严格 - 特别是当它不成熟但尚未广泛使用时。有时您可以返回并更改公共界面中的返回类型...有时您不能。

答案 2 :(得分:2)

我认为这是this question的更通用版本。我给出的一般建议是我遵循两条规则:

  • 接受最适用的基本类型
  • 返回用户需要的最丰富的类型