初始化接口?

问题描述:

在我遇到的一个当前问题中(printing a file to a physical printer in Java)我一直在通过代码运行,就像疯子试图从每个使用的类的javadoc中吞噬任何有用的遗漏信息。初始化接口?

现在,我从以前的问题中抽出了很多这样的代码,所以我没有写下自己。我注意到的问题是,我抓住的代码正在初始化一个对象,比如说“SimpleDoc”,它实现了一个接口(Doc)并将其分配给该接口?!

小的代码片断:

Doc mydoc = new SimpleDoc(textStream, flavor, null); 

现在据我被带到理解Java中,我们创建对象。我熟悉继承,并且熟悉使用接口允许类“继承”多个超类的技巧。

但这只是不正确。你可以创建一个实现接口的类,这对我来说很好。但是,当创建接口并将对象缩小到接口时发生了什么?当我准确地引用mydoc时,我在访问什么?

+2

mydoc是实现“Doc”接口的对象的引用。在这种情况下,该接口用于标识可以通过mydoc引用变量调用的方法。请注意,变量(mydoc)仍然是对象的引用。 – DwB 2012-01-12 20:54:56

诀窍是认识到你不是“创建”,“实例化”或“初始化”一个接口。你只是将一个变量定义为你知道实现这个接口的东西。

你基本上是告诉其他程序员对这个代码的工作,对于这种方法的其余部分,你只对事实感兴趣,定myDocDoc(即,一些满足Doc接口)。这可以使编程更简单,因为IDE的自动完成现在仅向您显示由此界面定义的方法,而不是SimpleDoc能够执行的所有操作。

想象一下,您将来希望扩展功能,以便根据某些输入实现Doc的不同实现。而不是明确创建SimpleDoc,你说:

Doc mydoc = docFactory.getByType(inputType); 

docFactory可以生产任何类型的Doc,这种方法并不真正关心什么样的被实例化,因为它会像对待一个Doc不管。

+0

另一个巨大的优势。如果您将来决定使用ComplexDoc或MySuperOptimizedDoc,则只需更改一行代码的右侧。 – user949300 2012-01-12 20:58:59

+0

@ user949300:可以说,改变一行代码的右边*和左边并不是那么困难。但是,通过首先编程接口,您不会邀请开发人员开始调用'SimpleDoc'上的方法,而这种方法无法在其他任何类型的'Doc'上执行。正如你指出的那样,这有助于减少在Doc类型更改时需要执行的重构量。 – StriplingWarrior 2012-01-12 21:02:03

+0

谢谢,现在更清楚了!我喜欢这种练习如何帮助更清楚地使用对象的开销知识,这真的有助于充实为什么使用这样的某些实践。 – Alex 2012-01-12 21:06:00

您无法创建接口,您在此处执行的操作是创建SimpleDoc类的对象mydoc,该类实现接口Doc。由于该类实现了此接口,因此您可以像处理该接口的实例一样处理mydoc。这允许您访问接口中的所有声明的方法,这是在类SimpleDoc

如果实现,例如,您的文档接口应该是这样的:

public interface Doc { 
    void print(); 
} 

和你SimpleDoc类看起来像这样:

public class SimpleDoc implements Doc { 

    public void clear() { ... } 

    @Override 
    public void print() { ... } 

} 

...那么你只能访问你print() - 方法mydoc -object。但你也可以这样说:

SimpleDoc mydoc = new SimpleDoc(); 

...然后您也可以拨打电话clear()