将对象声明为接口有什么好处?

可能重复:
“编程到界面”是什么意思?

我注意到有些人喜欢将对象声明为它实现的接口之一, 即使在变量范围内,也没有必要将其视为接口 ,例如,没有外部API需要接口。

例如:

Map someMap = new HashMap(); 

或者你可以这样做

 HashMap someMap = new HashMap(); 

并避免完全导入java.util.Map

通过接口(第一个上面)而不是类本身(上面第二个)声明它有什么好处?

谢谢

如果稍后不使用该变量,则没有优点/缺点。 您使用接口而不是对象的原因是允许更大的灵活性,但如果不使用该变量,则与性能持久性没有区别。

诸如Map类的接口声明了对象可以做什么。 另一方面,诸如HashMap 类的类定义了对象如何执行接口声明的操作。

如果声明一个变量(或字段,或其他) Map ,则表明您的代码仅依赖于该接口定义的协定 ,它不依赖于实现的细节。

如果你声明它是一个HashMap ,那就应该理解你需要一个特定版本的地图 (无论出于何种原因),并且它不能替换为其他东西。

我倾向于不喜欢像“因为你可以改变实施”这样的常见答案,因为经过多年和多年的实践,你会发现它不会经常发生,并且主要的好处实际上是微妙的(但是明确表达你的意图。

由于它不是API的一部分,因此它是实现细节。 在实现中具体化更好,这里没有任何意义。

我的回答

在java中使用接口或类型进行变量定义?

如果你使用Map someMap ,你正在设计一个接口而不是实现..所以你可以轻松地在其他实现之间切换..

因此,您的Map可以指向HashMapLinkedHashMap或任何其他对象,它是Map的子类。

所以,如果你有: –

 Map someMap = new HashMap<>(); 

您可以稍后更改实现(如果需要)指向LinkedHashMap : –

 someMap = new LinkedHashMap<>(); 

而如果在LHS上使用HashMap ,则只能指向HashMap类型的对象。

但是,因此性能没有差别..但建议始终designinterface而不是implementation ..

接口定义了类必须实现的方法。 这样 – 如果要调用接口定义的方法 – 您不需要知道对象的确切类类型,您只需要知道它实现了特定的接口。

例:

 interface Printer { public void print(String text); } class FilePrinter implements Printer { public void print(String text) { //append the text to a file } } class ScreenPrinter implements Printer { public void print(String text) { //write the text on the screen } } class SomeClass { public printSomething(Printer myPrinter) { myPrinter.print("Hello"); } } 

如果你调用SomeClass.printSomething(…),那么传递FilePrinter或ScreenPrinter的实例并不重要,因为该方法并不关心。 它知道该对象实现了接口Printer并且还实现了它的方法。

关于接口的另一个重点是类可以实现多个接口。