2012-03-13 26 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仍然是最后在这里,但至少模式是可重用的,你不必创建基于阵列的变通。

相关问题