返回对象时,我想要在多长时间内备份实现层次结构?
使用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();
}
任何人都可以提供任何一般性建议吗?
答案 0 :(得分:6)
您的退货类型应尽可能具体,以便为您的方法的消费者提供最大的灵活性。本着同样的精神,最佳做法是将任何参数的类型设置为尽可能抽象,以便您的方法的使用者在可以传递的类型方面具有更大的灵活性。
答案 1 :(得分:5)
我发现从类中公开类型时具体的问题的答案取决于您的期望和限制,以了解调用者如何与之交互您的班级以及您的代码可能如何发展。这是一个复杂的平衡行为。
例如,如果您希望调用者需要按索引访问元素,则可以返回List
,但如果没有,则Collection
可能就足够了。如果您希望限制调用者只能迭代结果而不更改它们 - 您希望返回Iterable<>
包装器。如果您知道您的内部表示可能会发生变化,您可能希望避免返回像List这样的特定类,以便消费者可以更加脱离您的实现。
回答这些问题并不容易 - 没有正确或错误的答案 - 也没有完美的指导方针。它需要经验,思想和直觉。而且(像我们大多数人一样),你可能会弄错。
我要说的是,就个人而言,我错误地认为我在代码中暴露的内容更加严格 - 特别是当它不成熟但尚未广泛使用时。有时您可以返回并更改公共界面中的返回类型...有时您不能。
答案 2 :(得分:2)
我认为这是this question的更通用版本。我给出的一般建议是我遵循两条规则: