2012-03-13 7 views
2

匿名の内部クラスから値を取得する必要がありました。内部クラスは近く、この恐ろしい回避策につながるコースの最後の変数、オーバーすることができます:内部クラスが単一要素配列を介して値を返すのを避けるにはどうすればよいですか?

public String sampleMethod(){ 
    final String[] output = new String[1]; 
    findResult(new SampleOperation(){ 
    @Override 
    private void perform(){ 
     output[0] = "result"; 
    } 
    }); 
    return output[0]; 
} 

private void findResult(SampleOperation op){ 
    op.perform(); 
} 

private static interface SampleOperation { 
    void perform(); 
} 

明らかに簡略化した例。ここでクラスは簡単に取り除くことができますが、問題の元がそこにあります。依存関係がさらにダウンする(findResult()の内部で、トリガされる必要のあるラッチなど)場合、そのようなクラスのラップを解除することは実用的ではありません。

最後の配列をラップするとアクセス可能ですが、これは私が今までに見つけた最悪の匂いの1つです。

このようなデリゲートから戻り値の型を取得するには、元気な方法がありますか? (つまりこれを使用しないでください)

+0

匂いが悪いです。致命的なコマンドパターンの使用のような匂い。深く暗い場所から、エンジニアリングされたプログラムが生成される – nsfyn55

答えて

3

ここでの問題は、SampleOperation.performが無効を返すことです。ただ、それはStringを返す(または汎用的なもの)を作成し、それは大丈夫です:

public String sampleMethod(){ 
    return findResult(new SampleOperation(){ 
    @Override 
    private String perform() { 
     return "result"; 
    } 
    }); 
} 

private String findResult(SampleOperation op){ 
    return op.perform(); 
} 

private static interface SampleOperation { 
    String perform(); 
} 

あなたが考えている時はいつでも最終的には、あなたがメソッドから返された値を考えるべきである「私は戻って値を取得する必要があります」 。このため

+0

+1:組み込みの例については、 'Callable 'を参照してください。 –

2

より良いパターンがコールバックインタフェースを使用している:

final ResultSender<String> sender = ...; 
findResult(new SampleOperation(){ 
    @Override 
    private void perform(){ 
     sender.send("result"); 
    } 
    }); 

変数senderはまだここに最終的なものではなく、少なくともパターンは、再利用可能であり、あなたが仕事の周りに基づいた配列を作成する必要はありません。

関連する問題