2017-05-16 12 views
2

とorherクラスでスレッドの挙動をシミュレートしようとすると:私はこのプログラムを実行するとは、私はこのクラスを持っているJavaの

public class MyThread { 
    public static void main(String[] args) { 
     Thread thread = new Thread() { 
      public void run() { 
       System.out.print("Test from Anonymous Class!"); 
      } 
     }; 
     Thread newThread = new Thread(thread); 
     newThread.run(); 
    } 
} 

、私はTest from Anonymous Class!を取得します。

さて、私はこのような別のクラスで、この動作をシミュレートしようとしている:私はこのプログラムを実行すると

interface MyInterface { 
    public void doTest(); 
} 

class MyClass implements MyInterface { 
    public MyClass() {} 

    public MyClass(MyInterface myInterface) {} 

    public void doTest() { 
     System.out.println("Test from MyClass!"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     MyClass myClass1 = new MyClass() { 
      public void doTest() { 
       System.out.println("Test from Anonymous Class!"); 
      } 
     }; 

     MyClass myClass2 = new MyClass(myClass1); 
     myClass2.doTest(); 
    } 
} 

、私はTest from MyClass!を取得します。なぜ拳の例ではTest from Anonymous Class!を印刷しているのですか? MyClassクラスで同じ動作をどうやって得ることができますか?

ありがとうございます!

+1

2番目の例は意味をなさない。匿名クラスを作成しますが、使用しません。それを使用する場合は、代わりに 'myClass1.doTest();'を呼び出します。どのような振る舞いをシミュレートしようとしているのか分かりませんが、サンプルコードは何もスマートではありません。コンストラクタパラメータを渡していますが、何もしていません。 – Kayaman

答えて

2

、あなたのターゲットを初期化する必要があります。

Threadコンストラクタは、カスタムクラスは、この動作を模倣しませんが、あなたがThread#start()を起動するとき、実行の対象として、パラメータとして提供さRunnableインスタンスを使用しています。あなたが実際にMyInterfaceパラメータを使用して、何も渡さないでください:

public MyClass(MyInterface myInterface) {} 

を委任を実装するには、MyClassMyInterfaceフィールドを追加し、コンストラクタで、それに価値をすべきです。
doTest()方法でそれを使用してください。

public MyClass(MyInterface myInterface) {} 

    private MyInterface myInterface; 
    ... 
    public MyClass(MyInterface myInterface) { 
    this.myInterface = myInterface; 
    } 

    public void doTest() { 
     // do some processing 
     .. 
     // then delegate 
     myInterface.doTest(); 
    } 
} 
+0

これは、エキスパートの答えの例です。共有してくれてありがとう! :) –

+0

完全に理解されています。ありがとうございました! –

+1

@Damian Latteneroあなたは優しいです。 – davidxxx

2

あなたのparamでmyClass1

public MyClass(MyInterface myInterface) {} 

を何もしないしているので、あなたは、パラメータを取得するのです、だから何?あなたは、パラメータが何をやりたい場合は、メソッドを呼び出す必要があります:あなたは何をやっている

myClass1.doTest() 


>"Test from Anonymous Class!" 

はまれですが、あなたは正しいオブジェクトからメソッドを呼び出す場合は、あなたが欲しいものを得るでしょう:)まれではあるが、有効な

もう一つの方法は、インスタンス変数を持っており、それを呼び出すことです:

class MyClass implements MyInterface { 
    MyClass myOtherClass; 

    public MyClass() {} 

    public MyClass(MyInterface myInterface) { 
     this.myOtherClass = myInterface; 
    } 

    public void doTest() { 
     System.out.println("Test from MyClass!"); 
    } 
} 

その後、あなたはその中にメソッドを呼び出します。

public class Test { 
    public static void main(String[] args) { 
     MyClass myClass1 = new MyClass() { 
      public void doTest() { 
       System.out.println("Test from Anonymous Class!"); 
      } 
     }; 

     MyClass myClass2 = new MyClass(myClass1); 
     myClass2.myOtherClass.doTest(); // calling method from myClass1 
    } 
} 
2

それはあなたのクラスのメソッドを呼び出しますので、あなたはあなたがコンストラクタインターフェイスのパラメータとして受け取りクラスから委任を実装したいと思われる

class MyClass implements MyInterface { 
     MyInterface myInterface; 
     public MyClass() {} 

     public MyClass(MyInterface myInterface) { 
      this.myInterface=myInterface; 
     } 

     public void doTest() { 
      if(myInterface !=null){ 
       myInterface.doTest(); 
       return; 
      } 
      System.out.println("Test from MyClass!"); 
     } 
    } 
+0

それだけです!私は同意する、それを初期化する必要があります!あなたにはちょうど良い;) –

1

答えは簡単です。 Threadのrun()メソッドはオーバーライドされ、常に実行されます。

2番目の例では、myClass2はインスタンスdoTest()メソッドを使用し、myClass1はコンストラクタを除き使用されません。

+0

それは本当です、あなたはthread1メソッドが呼び出される最良の方法は何だと思いますか? –

+0

私はmyClass2からmyOtherClassを公開しません。メディエーターのパターンは、私が示唆していることと多少似ています。 –

+0

私はそれを得る!よく考えた –

関連する問題