2017-05-03 4 views
0

J'ai deux classes et une interface.Instruction d'impression non appelée dans la classe anonyme transmise au constructeur de la classe

Interface:

public interface MyBirthdayEvent { 
    void itsMyBirthday(); 
} 

Première classe:

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

Deuxième classe:

public class MyBirthday { 

    private MyBirthdayButton myBirthdayButton = new MyBirthdayButton(); 

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

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

    }); 
    } 
} 

Puis, en principal, j'ai ceci:

public class TestThisStuff { 

    public static void main(String[] args) { 

    MyBirthday myBirthday = new MyBirthday(); 

    } 
} 

Comme le montre le code, j'utilise une classe anonyme dans le constructeur MyBirthday. Ce faisant, j'essaye d'obtenir la chaîne "Happy Birthday" pour imprimer à la console.

Mon problème est, quand j'appelle le constructeur MyBirthday en main en faisant un nouvel objet myBirthday, je ne vois pas la chaîne "Happy Birthday" imprimer sur la console. Ne devrait-il pas imprimer sur la console? Si non, ce que je fais mal?

+0

Ainsi, le constructeur de 'MyBirthday' ajoute le' onClilckedListener'. Qu'est-ce qui appelle exactement cette méthode? Est-ce censé être accroché dans une interface graphique comme Swing? Comme le code est maintenant, rien ne va invoquer la méthode. Sauf si je ne lis pas quelque chose correctement. – KevinO

+0

Dans le principal, quand j'appelle le constructeur, ne devrait-il pas appeler l'instruction d'impression puisque l'instruction d'impression habite dans le constructeur? –

+1

L'instruction print n'est pas dans le constructeur, elle est dans la méthode 'itsMyBirthday()' qui n'est pas invoquée (comme l'ont indiqué les réponses). Appelez la méthode ou déplacez l'instruction print pour qu'elle se trouve réellement dans le constructeur. – KevinO

Répondre

2

Ce que vous pouvez faire est la suivante:

public interface MyBirthdayEvent { 
    void itsMyBirthday(); 

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

...

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

    } 
} 

...

En outre, il fonctionnera sans cela, mais utilise un lambda plutôt qu'une classe interne anonyme. Cela semble beaucoup mieux.

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

Belle utilisation de l'interface par défaut et la recommandation pour le lambda. – KevinO

1

vous pouvez vous déplacer à votre déclaration System.out.println("some words") constructeur MyBirthdayEvent

il ne montre pas dans la console parce que vous ne l'avez pas invoquer la méthode