2012-03-13 33 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()內部存在依賴關係(例如需要觸發的鎖存器),則展開這樣的類將變得不切實際。

結束語最後陣列意味着它是可訪問的,但是這我曾經遇到最糟糕的氣味之一。

是否有一個健全的方式來獲得這樣的委託返回類型? (即不使用此?)

+0

它聞起來不好。聞起來像使用致命的命令模式。工程計劃產生的深黑暗地點 – nsfyn55 2012-03-13 13:08:19

回答

3

這裏的問題是,SampleOperation.perform返回void。只是使它返回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 ',瞭解內置示例。 – 2012-03-13 14:32:57

2

更好的模式是利用回調接口:

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

變量sender仍然是最後在這裏,但至少模式是可重用的,你不必創建基於陣列的變通。

相關問題