Javaのインタフェースのまとめ


Javaの最も基本的なパッケージはclassで、それ以外にインタフェースinterfaceもあります.この间ずっとインタフェースがどんな作用があるかを考えていて、インタフェースがあってどんな利益がありますか.ネット上の皆さんの文章と結びつけて、インタフェースの役割は以下のいくつかの面に現れています.
1.コールバック
2.メソッドパラメータ
3.マルチステート
以上の結論について、筆者自身も考え、インタフェースは能力の声明または能力の制約であると要約した.インタフェース能力の参照から見ると、これは能力の宣言です.このインタフェースに参照されるには、何らかの能力が必要です.インタフェースの実装から見ると,これが能力の制約である.1つのオブジェクトには複数の能力があるかもしれませんが、このインタフェースに参照されて指向されると、知能はこの能力を示します.以下、いくつかの例について自分の観点を説明します.
まず1つ目は、インタフェースとコールバックですが、この例が多すぎます.androidシステムのクリック応答実装を見てみましょう.
        Button button = new Button(this);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                
            }
        });
ここでは典型的なコールバックシーンです.メソッドに匿名の内部クラスを渡し,onlickのメソッドを実現した.そのまま書くと、裸の能力宣言のように感じられ、空の方法でもonlickメソッドを実現しなければなりません.もちろんそう書いてもいいよsetOnClickListener(this);メソッドにオブジェクト参照を渡します.このオブジェクトはこのインタフェースを実現します.もちろん、このオブジェクトは、次のコードなど、より多くのインタフェースを実現することもできます.
public class MainActivity extends Activity implements View.OnClickListener,
        View.OnLongClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = new Button(this);
        button.setOnLongClickListener(this);
        button.setOnClickListener(this);
    }

    @Override
    public boolean onLongClick(View v) {
        return false;
    }

    @Override
    public void onClick(View v) {
    }
}

ここでは能力の制約を感じることができ,thisは長押しと短押しに対する応答能力を持っているが,1つの方法では1つしか示されていない.インタフェースはパラメータとして使用されます.例は前述の例であり,setOnClickListenerメソッドのパラメータタイプはインタフェースである.インタフェースを使わなければ、クラスしか使えません.クラスはちょっと重いですが、一つのクラスには一つの能力しかありません.またクラスであれば、buttonを使うのも不便です.setOnClickListener(this);この方式です.このように見ると、インタフェースを使うのは確かに多くのことを節約した.最後にインタフェースは多態を示すために用いられ,これは上のものと確かに異なり,新しい例を挙げなければならない.最も古典的なのは工場モデルでしょう.
//    
interface Car {
    public void run();
    public void stop();
}


//      
class Benz implements Car {
    public void run() {
        System.out.println("Benz     。。。。。");
    }

    public void stop() {
        System.out.println("Benz   。。。。。");
    }
}

class Ford implements Car {
    public void run() {
        System.out.println("Ford     。。。");
    }

    public void stop() {
        System.out.println("Ford   。。。。");
    }
}

//   
class Factory {
    public static Car getCarInstance(String type) {
        Car c = null;
        if ("Benz".equals(type)) {
            c = new Benz();
        }
        if ("Ford".equals(type)) {
            c = new Ford();
        }
        return c;
    }
}
ここから見ると、carは能力の声明であり、この能力を伝える工場もあり、この工場から出てきた各製品はrunとstopの2つの機能を持っている.インタフェースを実現するためのbenzとfordの2つのクラスとして、benzが1つの飛行機インタフェースを実現することができ、fordが1つの船のインタフェースを多く実現することができるなどの他の能力を持つこともできます.このようにcar factoryから出るとcarの能力しか与えられず、他のfactoryから出ると別の能力があることを制約します.
個人的にインタフェースの役割を理解するのに一番いいところはJavaコンテナシリーズインタフェースを読むことだと思います.例えばJavaはarraylist、linkedlist、hashmapなどの良質な容器を提供しています.これはただの容器で、彼らは多くのものを入れることができて、それぞれそれぞれの長所と短所があります.木有は発見して、データ構造の中で言うスタック、キューはここでインタフェースの方式で声明をして、例えばDeque、List、Queue.スタックのため、スタックはただ1種の能力の声明で、先進的に先に出て、先進的に後に出て、そのいくつかの能力を実現すればいいです.あなたがどのように実現したのかに注目しないで、あなたがこの能力以外にどんな能力があるのかに注目しません.arraylist、linkedlistのいくつかのインタフェースが実現されていることがわかります.APIが外部にアクセスする方法を提供し、外部にパラメータを提供する必要がある場合、パラメータタイプをlistと宣言することができます.これにより、データが削除されることが多い場合はlinkedlistを使用し、よく検索すればarraylistを使用することができます.
一度まとめるのは容易ではありませんが、転載は出典を明記してください.ありがとうございます.