package lecture.etc;

import jp.avaj.lib.debug.L;

/**
 * 無名(匿名)クラス Java
 *
 * 処理をしたいその場でクラスを定義してメソッドを呼び出す方法
 * 同じ処理が他では必要がない場合に便利
 * また無駄にクラスが増えない
 *
 * 無名(匿名)クラスの定義方法とメソッドの呼び出しは以下の組合せがあるが、
 * 特に利点・欠点はない
 *
 * 無名(匿名)クラスの定義方法
 * 1.Objectクラスを元にする
 * 2.インターフェースを元にする
 * 3.抽象クラスを元にする
 * 4.具象クラスを元にする
 *
 * 実行するメソッド
 * 1.元のクラスにあるメソッドを再定義する
 * 2.元のクラスにないメソッドを定義する
 */
class AnonymousClass {
  public static void main(String[] args) {
    //
    // 1.Objectクラスを元にする + 2.元のクラスにないメソッドを定義する
    (new Object(){
      public void printString() {
        L.p("hello");
      }
    }).printString();
    //
    // 2.インターフェースを元にする + 1.元のクラスにあるメソッドを再定義する
    (new If() {
      public void printString() {
        L.p("hello");
      }
    }).printString();
    //
    // 2.インターフェースを元にする + 2.元のクラスにないメソッドを定義する
    (new If() {
      public void printInt() {
        L.p(5);
      }
      // こちらも定義することが必要
      public void printString() {
        // 処理なし
      }
    }).printInt();
    //
    // 3.抽象クラスを元にする + 1.元のクラスにあるメソッドを再定義する
    (new AbstractClass() {
      public void printString() {
        L.p("hello");
      }
    }).printString();
    //
    // * 抽象クラスを元にする + 2.元のクラスにないメソッドを定義する
    (new AbstractClass() {
      public void printInt() {
        L.p(5);
      }
      // こちらも定義することが必要
      public void printString() {
        // 処理なし
      }
    }).printInt();
    //
    // 4.具象クラスを元にする + 1.元のクラスにあるメソッドを再定義する
    (new ConcreteClass() {
      public void printString() {
        L.p("hello");
      }
    }).printString();
    //
    // 4.具象クラスを元にする + 2.元のクラスにないメソッドを定義する
    (new ConcreteClass() {
      public void printInt() {
        L.p(5);
      }
    }).printInt();
  }

  public interface If{
    public void printString();
  }

  public static abstract class AbstractClass {
    public abstract void printString();
  }

  public static class ConcreteClass {
    public void printString() {
      // 処理なし
    }
  }
}
//---------------------------------------------------
//・目次 Javaエトセトラ
//  http://blogs.yahoo.co.jp/artery2020/40576157.html
//・目次 - Java入門
//  http://blogs.yahoo.co.jp/artery2020/39975776.html
//・目次 - ビジネスパーソンの常識と非常識
//  http://blogs.yahoo.co.jp/artery2020/39728331.html
//・目次 - 論理・発想・思考についての考察と鍛え方
//  http://blogs.yahoo.co.jp/artery2020/39657784.html
//---------------------------------------------------