Javaでコールバック関数Callbackのいきさつを説明する(二)


Javaでコールバック関数Callbackのいきさつを説明する(一)では、Javaでコールバック関数が何なのかを説明していますが、本当にJavaを使ってコールバック関数を書くときはインタフェースで完成します.
GithubはProgrammerをコールバックできる方法のほかに、Studentクラスの関数をコールバックできるようにする必要があります.前のGithubクラスのコードを見てみましょう.
public class Github {
    public void push(Programmer p ){
        System.out.println("git push");
        p.recordToday();
    }
}

問題がないことを発見して、Githubは以前の方式によって、Programmerクラスに入るしかなくて、今どのように解決しますか、2つの方式があります.1つはもちろん関数のリロードです.もう1つのpush関数like soを書きます.
public void push(Student s )

この方法はもちろんいいですが、インタフェースを使って個人的にもっといいと思います.そうしないと、後でteacherクラスがもう一つ来て、teacherクラス関数を受け入れ続けるのではないでしょうか.
OK、インタフェースがついに登場します:RecodeInterfaceのインタフェースを定義します:
public interface RecodeInterface {
    public void recode();
}

インタフェースにrecode()メソッドを定義します.
Programmerクラスの場合、コードは次のとおりです.
public class Programmer {
     public void code(){
         System.out.println("coding");
         new Github().push(new ProgrammerRecordToday());
     }
     public class ProgrammerRecordToday implements RecodeInterface{
         @Override
         public void recode() {
             System.out.println("Programmer done " + new Date());
         }
     }
}

ここにはProgrammerRecordTodayの内部クラスがあり、RecodeInterfaceインタフェースを実現しています.Studioクラスのコードをもう一度見てみましょう.
public class Student {
    public void code(){
        System.out.println("coding");
        new Github().push(new StudentRecodeToday());
    }

    public class StudentRecodeToday implements RecodeInterface{
        @Override
        public void recode() {
            System.out.println("Student done "+ new Date());
        }
    }
}

同じように、StudentRecodeToday内部クラスがあり、RecodeInterfaceインタフェースを実現しています.
次はGithubクラスです.
public class Github {
    public void push(RecodeInterface r ){
        System.out.println("git push");
        r.recode();
    }
}

GithubのpushメソッドはRecodeInterfaceインタフェースを受け入れるようになったので,両クラスの内部クラスはpushメソッドで受信できるようになった.
これによりインタフェース形式でコールバックが完了する.
コードはgithubに置きました.https://github.com/zkuestc/CallbackDemo