2012-01-12 12 views
8

私は(printing a file to a physical printer in Java)私は、使用された各クラスのjavadocから欠けている有用な情報を貪欲にしようとする狂人のようなコードを実行しています。インターフェイスの初期化?

今、私は以前の質問からこのコードのかなりの部分を引っ張ってきたので、私は自分自身を書きませんでした。私が気づいた問題は、オブジェクトを初期化することで、インターフェイス(Doc)を実装し、それをそのインターフェイスに割り当てる "SimpleDoc"と言ったコードを取得したことです。

リトルコードスニペット:

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

は、今まで私はJavaで理解するために導かれたとして、我々は、オブジェクトを作成します。私は継承に精通しており、クラスが複数のスーパークラスを「継承」できるようにするためにインターフェイスを使用するというトリックに精通しています。

しかし、これは正しいことではありません。インターフェイスを実装するクラスを作成することができます。しかし、ここでは、インターフェイスが作成され、オブジェクトがそのインターフェイスに縮小されるときに何が起こっていますか? mydocを正確に参照すると、私は何にアクセスしていますか?

+2

mydocは、 'Doc'インタフェースを実装するオブジェクトへの参照です。この状況では、インタフェースは、mydoc参照変数を介して呼び出すことができるメソッドを識別するために使用されます。変数(mydoc)は依然としてオブジェクトへの参照であることに注意してください。 – DwB

答えて

5

インターフェイスを「作成」、「インスタンス化」、または「初期化」していないことを認識するのがこのトリックです。変数を定義するだけで、そのインターフェースを実装することがわかっているものとして定義されます。

あなたは、本質的に、この方法の残りの部分のために、あなたはmyDocDocDocインタフェースを満たすつまり、何か)であるという事実にのみ関心があることを、このコードに取り組んで他のプログラマを語っています。 IDEのオートコンプリートでは、SimpleDocが実行できるすべてではなく、このインターフェイスで定義されたメソッドのみが表示されるため、プログラミングが簡単になります。

いくつかの入力に応じて異なる実装を持つことができるように、今後は機能を拡張したいとします。むしろ明示的SimpleDocを作成するよりも、あなたが言う:

Doc mydoc = docFactory.getByType(inputType); 

docFactoryDocのいずれかのタイプを生成することができ、関係なく、Docのように扱うために起こっているので、この方法は実際に、インスタンス化されますどのような気にしません。

+0

もう1つ大きな利点があります。将来、ComplexDocまたはMySuperOptimizedDocを使用することを決定した場合は、1行のコードの右側を変更するだけで済みます。 – user949300

+0

@ user949300:おそらく、1行のコードの右辺と左辺を変更することはそれほど難しいことではありません。しかし、最初にインターフェースをプログラミングすることで、開発者は 'SimpleDoc'メソッドを呼び出すことができません。これは' Doc'のすべての種類では実行できませんでした。あなたが指摘しているように、これは、Docタイプが変更された場合に実行する必要があるリファクタリングの量を減らすのに役立ちます。 – StriplingWarrior

+0

ありがとう、それは今よりはっきりしています!私は、このプラクティスがオブジェクトの使用をより明確にするのに役立つオーバーヘッドの知識を楽しんでいます。これは、このような特定のプラクティスを使用する理由を実際に助けます。 – Alex

4

インターフェイスを作成できません。ここで行うことは、インターフェイスDocを実装するSimpleDocクラスのオブジェクトmydocを作成することです。クラスはこのインタフェースを実装しているため、あたかもそのインタフェースのインスタンスであるかのようにmydocを扱うことができます。これはあなたのDoc-Interfaceは、次のようになり、あなたが例えば、クラスSimpleDoc

た場合には実装されているインタフェースで宣言されたすべてのメソッドにアクセスすることができます:

public interface Doc { 
    void print(); 
} 

とあなたのSimpleDocクラスが見えますこのように:

public class SimpleDoc implements Doc { 

    public void clear() { ... } 

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

} 

...そしてあなただけのprint() -method mydoc -objectにアクセスすることができました。しかし、あなたは言うこともできる:

SimpleDoc mydoc = new SimpleDoc(); 

...clear()