1

変数alphaに値を設定するJavaのクラスAがあります。クラスAは、以下のようにインターフェース「MessageListener」の関数を呼び出します。

private List<MessageListener> mListeners;

for (MessageListener ml : this.mListeners) 
{
ml.messageTransferred(aMessage, from, this.host, isFirstDelivery);
}

上記のインターフェースを実装するMessageStatsReport.javaクラスのmessageTransferred関数にアルファを渡したい。

messageTransferred関数の引数を変更すると、同じインターフェイス(MessageListener)の他の12のクラスに影響します。では、簡単な方法は何ですか?クラスAで設定された(非静的)変数値を呼び出すにはどうすればよいですか?助けてください。

4

2 に答える 2

1

messageListenersの配列がAによって呼び出された場合、MessageListenerはどのようにしてアルファについて「知っている」と想定されますか?呼び出されたメソッドは、呼び出し先のタイプが変更される可能性があるため、その中の呼び出し先のプロパティまたはメソッドにアクセスできません。Aにアルファを認識​​させたい場合は、アルファを渡す必要があります。

MessageListenerが別のパラメーターを処理することによって定義するコントラクトを変更していることに注意してください。誰も知らないうちにインターフェースのコントラクトに違反する可能性がある場合、それは意味がありません(Javaの観点では、一部の言語では許可されています)これ)。

あなたはメッセージを渡しています、アルファはそのメッセージの一部であるべきではありませんか?aMessageはどのような形式ですか?

1つの解決策は、転送される実際のメッセージがどのように見えるかを定義するインターフェースを定義することです。単純化された方法で、messageインターフェースを持ち、それを実装するSimpleMessageとを持っていることができます。ComplicatedMessageaMessageはそのタイプにすることができ、インターフェースが定義した内容に基づいてコンテンツを処理できます。

于 2012-09-03T19:16:21.433 に答える
1

次のメソッドを作成します

messageTransferred(aMessage, from, this.host, isFirstDelivery, alpha)  
{   
   if (alpha != null)  
   {
   // ...  
}  

そして今、alfphaをメソッドに渡したい場合は、

messageTransferred(aMessage, from, this.host, isFirstDelivery, alpha);  

アルファを使用したくない場合はnull、アルファの代わりに パスします

messageTransferred(aMessage, from, this.host, isFirstDelivery, null); 
于 2012-09-03T19:24:52.683 に答える