为什么应该优先选择Java类的接口?

10 浏览
0 Comments

为什么应该优先选择Java类的接口?

PMD会对以下代码报告违规:

ArrayList list = new ArrayList();

违规的原因是“避免使用实现类型如'ArrayList';应该使用接口代替”。

以下代码行将修正此违规:

List list = new ArrayList();

为什么应该使用后者的List而不是ArrayList

0
0 Comments

为什么应该优先使用Java类的接口?这个问题的出现的原因是,使用接口而不是具体类型是良好封装和松耦合代码的关键。这样做的好处是,如果需要,在未来更改底层实现将更容易,同时也更容易为代码添加单元测试(使用Mocking技术)。使用接口还可以提高代码的抽象性。

解决方法是优先使用接口作为Java类的类型。通过使用接口,可以封装具体实现细节,从而实现良好的封装性和松耦合性。如果需要特定功能,可以根据需要使用具体实现类。此外,使用接口还可以方便后续对代码进行单元测试和底层实现的更改。

另外,使用"Collection"代替"List"是否更抽象?这取决于具体实现细节。如果使用"Collection",则除了执行具体实现的最终类之外,所有中间类对于从"Set"到"List"的更改都是透明的。如果调用者需要特定功能,则可以根据需要使用对象。

另外,如果将数据结构初始化为ArrayList类,那么只能使用ArrayList类的方法访问附加的数据。无法重新将"list"初始化为LinkedList等其他类。要同时访问ArrayList和LinkedList的方法,最好的方法是使用接口。

总之,优先使用接口作为Java类的类型可以实现良好的封装和松耦合性,方便进行单元测试和底层实现的更改,并提高代码的抽象性。

0
0 Comments

为什么应该优先选择Java类的接口?

在一般情况下,我同意将接口与实现分离是一件好事,可以使代码更易于维护。但是,必须考虑到一些例外情况。通过接口访问对象会增加一层额外的间接性,这会使代码变慢。

为了验证这一点,我进行了一个实验,生成了100亿个对一个长度为100万的ArrayList进行顺序访问。在我的2.4Ghz MacBook上,通过List接口访问ArrayList的平均时间为2.10秒,而声明为ArrayList类型的平均时间为1.67秒。

如果你在内部循环或频繁调用的函数中处理大型列表,那么这是需要考虑的问题。

接下来的回答展示了接口造成的开销可能非常小:stackoverflow.com/questions/890687/…

哇!10亿次访问只需要0.5秒,也就是说,接口访问比类访问慢了半纳秒!这当然是永远不要使用接口的原因。

但是,如果你的代码中有几百个这样的地方(在大型应用程序中可能非常容易出现),并且你的应用程序处理的是TB级的数据,那么0.5纳秒就可以成为1秒。

尽管接口访问可能会带来一些性能上的开销,但在大多数情况下,将接口与实现分离是更好的选择,可以使代码更易于维护。然而,在处理大型列表或性能要求较高的场景中,需要考虑接口访问可能带来的性能损失。

0
0 Comments

为什么应该首选Java类的接口?

首选Java类的接口是因为这样可以将代码与列表的实现解耦。使用接口可以轻松地更改实现,例如在这种情况下更改ArrayList为另一种列表实现,而无需更改其他任何代码,只要它仅使用在List中定义的方法。

这种做法的原因是,通过使用接口,我们可以将代码与列表的具体实现分离开来。在Java中,接口是一种定义了一组方法的抽象类型,而类则是接口的具体实现。通过编程时使用接口而不是具体的类,我们可以将代码与特定的实现解耦。这样,如果我们需要更改列表的实现,例如从ArrayList更改为LinkedList,我们只需要更改类的实例化部分,而不需要更改其他使用列表的代码。这样的好处是非常明显的,因为它使代码更加灵活和可维护。

接口的使用方法是定义一个接口,例如List,其中包含了我们需要的方法,例如add、remove和get等。然后,在编写具体的类时,我们可以实现这个接口并提供方法的具体实现。通过这种方式,我们可以编写与特定实现无关的代码,只需使用接口中定义的方法。

在这个例子中,我们首选使用List接口而不是ArrayList类。因为使用接口,我们可以轻松地将ArrayList更改为其他列表实现,而不需要更改其他使用列表的代码。这种解耦的方法使得我们的代码更加灵活和可扩展。

首选Java类的接口是一种良好的编程实践,它使代码更灵活、可维护和可扩展。通过将代码与具体实现解耦,我们可以轻松地更改实现而不需要更改其他代码。这种做法可以提高代码的可复用性和可维护性,同时也符合面向对象编程的原则。

0