Language agnostic 编程到接口,如何泛型太泛型?
在返回对象时,我要备份实现层次结构到什么程度 以Java集合接口为例,这是否合适Language agnostic 编程到接口,如何泛型太泛型?,language-agnostic,oop,interface,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; } 或
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();
}
有人能提供一般性建议吗?您的退货类型应尽可能具体,以便为您的方法的消费者提供最大的灵活性。本着同样的精神,使任何参数的类型尽可能抽象也是最佳实践,这样方法的使用者也可以更灵活地传递什么类型的参数。我认为这是一个更通用的版本。我给出的一般建议是,我遵循两条规则:
- 接受最基本的工作类型
- 返回用户需要的最丰富类型
列表
,但如果没有,则集合
可能就足够了。如果要限制调用方只能迭代结果而不能更改它们,则需要返回Iterable
包装。如果您知道您的内部表示可能会发生变化,那么您可能希望避免返回非常特定的类,如List,这样消费者就可以与您的实现更加解耦
回答这些问题并不容易——没有正确或错误的答案——也没有完美的指导方针。它需要经验、思想和直觉。而且(像我们大多数人一样),你可能会弄错
我要说的是,就我个人而言,我犯了一个错误,那就是在我从代码中暴露的内容上更加严格——特别是当它还不成熟并且还没有被广泛使用的时候。有时,您可以返回并更改公共界面中的返回类型。。。有时您不能。但这给了您很小的灵活性,无法在以后更改实现。这是一种平衡行为。非常正确——这是一种平衡行为。但是,通过将特定接口指定为返回类型,您至少可以自由地切换实现。Jon,您会提出什么替代方案?或者这是一个取决于没有严格的规则设计选择的情况吗?这些都是很好的点——我唯一的补充就是考虑代码的最终使用。您正在创建公共框架吗?如果需要,您是否能够访问(从而重构)所有方法调用方?预期用途更容易确定您当前是否有消费者,而不是确定(猜测?)未来的灵活性。您如何可能预测您的用户将需要什么?很难预测,但这就是软件工程的全部内容。:-)就是,;根据你的最佳猜测选择一个合理的选择;根据需要调整(迭代)。