在一个类中,我必须调用另一个需要两个参数的类的构造函数,即IHelloServiceConnectionObserver和ContextWrapper.问题是他们都是这个.
注意:ContextWrapper是一个我无法控制的框架类(实际上是android.content.ContextWrapper).我的类(一个Android Activity)已经是一个ContextWrapper,我想把它混合一点IHelloServiceConnectionObserverness.
另请注意,我的类是几个都继承自ContextWrapper的类之一,因此组合ContextWrapper和IHelloServiceConnectionObserer将不起作用.
我能做到这一点:
HelloServiceConnection svc = HelloServiceConnection(this,this);
电话
public HelloServiceConnection(IHelloServiceConnectionObserver observer, ContextWrapper contextWrapper){
this.observer = observer;
this.contextWrapper = contextWrapper;
}
但这看起来很傻.或者我可以这样做:
HelloServiceConnection svc = HelloServiceConnection(this);
电话
public HelloServiceConnection(IHelloServiceConnectionObserver observer){
this.observer = observer;
this.contextWrapper = (ContextWrapper) observer;
}
但现在我将一个很好的编译时错误移动到运行时错误.
这里的最佳做法是什么?
编辑:嗯,我不能说这是一个“最佳实践”,但对于我的特殊情况,Jon Skeet有正确的答案.这是代码最终看起来像:
helloServiceConnection = HelloServiceConnection.create(this);
电话
public static HelloServiceConnection create(T value){
return new HelloServiceConnection(value, value);
}
反过来打电话
private HelloServiceConnection(IHelloServiceConnectionObserver observer, ContextWrapper contextWrapper){
this.observer = observer;
this.contextWrapper = contextWrapper;
}
因此,让我更多地说明为什么这是这种特殊情况的正确答案.由于ContextWrapper是我无法控制的框架的一部分,我无法改变它.因为它也是几个类的祖先,其中任何一个我可能想要使用HelloServiceConnection,所以扩展ContextWrapper的所有后代以在IHelloServiceConnectionObserver中添加它是没有意义的.
所以我以为我离开的时候别无选择,只有这个,这个偶像.一旦我理解了乔恩的回答,就可以节省一天的时间!
谢谢,乔恩 – 并感谢所有参与的人.