PMD将针对以下情况报告违规:
ArrayList<Object> list = new ArrayList<Object>();
违规是“避免使用像‘ArrayList’这样的实现类型;使用接口来代替”。
下面这一行可以纠正违规行为:
List<Object> list = new ArrayList<Object>();
为什么应该使用带有List
的后者而不是ArrayList
发布于 2008-09-29 04:20:13
使用接口而不是具体类型是良好的封装和松散耦合代码的关键。
在编写您自己的API时,遵循这种做法甚至是一个好主意。如果您这样做了,您稍后会发现向代码中添加单元测试(使用模拟技术)以及在将来需要时更改底层实现会更容易。
这是一个关于这个主题的good article。
希望它能帮上忙!
发布于 2008-09-29 04:04:28
这是首选的,因为您可以将代码从列表的实现中解耦。使用该接口,您可以轻松地将实现(本例中为ArrayList )更改为另一个List实现,而无需更改任何剩余代码,只要它只使用list中定义的方法即可。
发布于 2008-09-30 01:06:42
总的来说,我同意将接口与实现分离是一件好事,这将使您的代码更易于维护。
但是,您必须考虑一些例外情况。通过接口访问对象会增加额外的间接层,这会使代码变慢。
出于兴趣,我运行了一个实验,生成100亿次对100万个长度的ArrayList的顺序访问。在我的2.4 the上,通过列表接口访问ArrayList平均需要2.10秒,当声明它为ArrayList类型时,平均需要1.67秒。
如果您正在处理大型列表,深入内部循环或频繁调用函数,则需要考虑这一点。
https://stackoverflow.com/questions/147468
复制相似问题