我发现自己同意返回接口而不是具体类。
原因很简单,我想要松散耦合。
但是会有其他影响或权衡吗?
最好返回与您的接口相适应的最通用类型。
如果有某些原因使得ArrayList
本质上适合您要返回的数据,则应使用它。通常List
是可以的,但如果返回的值本质上是无序的,则还可以考虑使用Collection
:
对于像List或ArrayList这样的类型,不应该存在任何问题,您应该返回List以推广代码接口。
如果这是来自并发包(如CopyOnWriteArrayList),并且您正在使用诸如addIfAbsent之类的方法,则会限制您这样做。
因此,如果您返回ArrayList或任何具体实现,那么您可以使用未在契约(List
接口)中定义的API,但是您将受到从特定实现更改为其他内容(从ArrayList
更改为LinkedList
)的限制,因为每个使用您的API的人都必须根据您的更改进行更改。我认为这要求太高了。
List
接口之外的ArrayList
方法。但是,如果该对象是ArrayList
,则可以进行强制转换。返回具体类的唯一原因可能是调用者需要知道这个具体实现或者可能需要使用具体实现上的额外接口。例如,在Android中,你经常需要使用 ArrayList
,因为框架不知道如何正确地序列化通用的 List
接口。