将对象声明为接口有什么好处?
可能重复:
“编程到界面”是什么意思?
我注意到有些人喜欢将对象声明为它实现的接口之一, 即使在变量范围内,也没有必要将其视为接口 ,例如,没有外部API需要接口。
例如:
Map someMap = new HashMap();
或者你可以这样做
HashMap someMap = new HashMap();
并避免完全导入java.util.Map
。
通过接口(第一个上面)而不是类本身(上面第二个)声明它有什么好处?
谢谢
如果稍后不使用该变量,则没有优点/缺点。 您使用接口而不是对象的原因是允许更大的灵活性,但如果不使用该变量,则与性能持久性没有区别。
诸如Map
类的接口声明了对象可以做什么。 另一方面,诸如HashMap
类的类定义了对象如何执行接口声明的操作。
如果声明一个变量(或字段,或其他) Map
,则表明您的代码仅依赖于该接口定义的协定 ,它不依赖于实现的细节。
如果你声明它是一个HashMap
,那就应该理解你需要一个特定版本的地图 (无论出于何种原因),并且它不能替换为其他东西。
我倾向于不喜欢像“因为你可以改变实施”这样的常见答案,因为经过多年和多年的实践,你会发现它不会经常发生,并且主要的好处实际上是微妙的(但是明确表达你的意图。
由于它不是API的一部分,因此它是实现细节。 在实现中具体化更好,这里没有任何意义。
我的回答
在java中使用接口或类型进行变量定义?
如果你使用Map
,你正在设计一个接口而不是实现..所以你可以轻松地在其他实现之间切换..
因此,您的Map
可以指向HashMap
, LinkedHashMap
或任何其他对象,它是Map
的子类。
所以,如果你有: –
Map someMap = new HashMap<>();
您可以稍后更改实现(如果需要)指向LinkedHashMap
: –
someMap = new LinkedHashMap<>();
而如果在LHS上使用HashMap
,则只能指向HashMap
类型的对象。
但是,因此性能没有差别..但建议始终design
到interface
而不是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并且还实现了它的方法。
关于接口的另一个重点是类可以实现多个接口。