一尘不染

实例化接口

java

扩展初始化接口时提出的问题?),我们在实例化接口的同时用实现的类对其进行初始化。

我的问题是,为什么首先要使用Interface实例化它?为什么我不能直接用实现的类实例化它?例如。:

Doc mydoc = new SimpleDoc();

Doc是接口,而SimpleDoc正在实现它。SimpleDoc有什么问题?mydoc = new SimpleDoc(); 哪里会失败?


阅读 184

收藏
2020-12-03

共1个答案

一尘不染

通常,最好的方法是依赖系统中的抽象类型(接口或抽象类)。

在您的示例中,您确实可以编写:

SimpleDoc mydoc = new SimpleDoc()

但是,问题在于所使用的代码mydoc将取决于具体类型SimpleDoc。但这本身不一定是问题,但是,假设您创建了一个新的实现Doc,例如ComplexDoc

您可以将声明更改为:

ComplexDoc mydoc = new ComplexDoc();

现在,您传递mydoc给的所有place方法也都必须更改。

但是,如果您Doc最初使用过,则只需要进行一次更改:

Doc mydoc = ComplexDoc();

当您使用Collections API时,这非常有用,在这种情况下,通常会转换另一个实现,或者在测试用例中使用Mocking。

2020-12-03