2017-05-03 6 views
0

私は2つのクラスと1つのインタフェースを持っています。クラスのコンストラクタに渡された匿名クラスでprint文が呼び出されない

インタフェース:

public interface MyBirthdayEvent { 
    void itsMyBirthday(); 
} 

ファーストクラス:

public class MyBirthdayButton 
{ 
    public void addOnClickedListener(MyBirthdayEvent mbe){} 
} 

セカンドクラス:

public class TestThisStuff { 

    public static void main(String[] args) { 

    MyBirthday myBirthday = new MyBirthday(); 

    } 
} 

public class MyBirthday { 

    private MyBirthdayButton myBirthdayButton = new MyBirthdayButton(); 

    MyBirthday() { 
     myBirthdayButton.addOnClickedListener(new MyBirthdayEvent() { 

     public void itsMyBirthday() { 
      System.out.println("Happy Birthday"); 
    }   

    }); 
    } 
} 

次にメインに、私はこれを持っています

コードからわかるように、私はMyBirthdayコンストラクタで匿名クラスを使用しています。これを行うには、文字列"Happy Birthday"をコンソールに出力しようとしています。

新しいmyBirthdayオブジェクトを作成してMyBirthdayコンストラクタをmainに呼び出すと、文字列"Happy Birthday"がコンソールに表示されません。それはコンソールに印刷してはいけませんか?そうでない場合、私は何を間違っているのですか?あなたは法に

+0

したがって、 'MyBirthday'のコンストラクタは' onClilckedListener'を追加します。上記の方法を正確に呼び出すのは何ですか?これはSwingのようなGUIに夢中になっていますか?コードが現れたので、このメソッドを呼び出すものは何もありません。私がちょうど何かを正しく読んでいない限り。 – KevinO

+0

mainでは、コンストラクタを呼び出すときに、print文がコンストラクタ内に存在するので、print文を呼び出すべきではありませんか? –

+1

printステートメントはコンストラクターにはありません。メソッドが 'itsMyBirthday()'にあり、呼び出された場所はありません(答えが指摘されているので)。メソッドを呼び出すか、実際にコンストラクターに入るようにprintステートメントを移動します。 – KevinO

答えて

2

を起動していないので、それはあなたが何ができるか、あなたのコンソールには表示されませんでしたあなたのMyBirthdayEventコンストラクタに

System.out.println("some words")文を移動することができます

+0

インターフェイスのデフォルトの使い方とラムダの推奨事項。 – KevinO

1

はこれです:

public interface MyBirthdayEvent { 
    void itsMyBirthday(); 

    default void invoke() { 
     itsMyBirthday(); 
    } 
} 

...

public class MyBirthdayButton 
{ 
    public void addOnClickedListener(MyBirthdayEvent mbe){ 
     mbe.invoke(); 

    } 
} 

...

また、無作為に動作しますが、匿名の内部クラスではなくラムダを使用します。これははるかに良く見えます。

MyBirthday() { 
     myBirthdayButton.addOnClickedListener(() -> 
             System.out.println("Happy Birthday")); 
    }