在一个类中,我必须调用另一个需要两个参数a IHelloServiceConnectionObserver和a的类的构造函数ContextWrapper.问题是他们两个都是this.
注意:ContextWrapper是一个我无法控制的框架类(android.content.ContextWrapper实际上).我的班级(一个Android Activity)ContextWrapper已经是一个,而且我想混合一点IHelloServiceConnectionObserver.
还要注意,我的类是所有继承的几个类之一ContextWrapper,因此组合ContextWrapper并且IHelloServiceConnectionObserer不起作用.
我能做到这一点:
HelloServiceConnection svc = HelloServiceConnection(this,this);
Run Code Online (Sandbox Code Playgroud)
电话
public HelloServiceConnection(IHelloServiceConnectionObserver observer, ContextWrapper contextWrapper){
this.observer = observer;
this.contextWrapper = contextWrapper;
}
Run Code Online (Sandbox Code Playgroud)
但这看起来很傻.或者我可以这样做:
HelloServiceConnection svc = HelloServiceConnection(this);
Run Code Online (Sandbox Code Playgroud)
电话
public HelloServiceConnection(IHelloServiceConnectionObserver observer){
this.observer = observer;
this.contextWrapper = (ContextWrapper) observer;
}
Run Code Online (Sandbox Code Playgroud)
但现在我将一个很好的编译时错误移动到运行时错误.
这里的最佳做法是什么?
编辑:嗯,我不能说这是一个"最佳实践",但对于我的特殊情况,Jon Skeet有正确的答案.这是代码最终看起来像:
helloServiceConnection = HelloServiceConnection.create(this);
Run Code Online (Sandbox Code Playgroud)
电话
public static <T extends ContextWrapper & IHelloServiceConnectionObserver> HelloServiceConnection create(T value){
return new HelloServiceConnection(value, value);
}
Run Code Online (Sandbox Code Playgroud)
反过来打电话
private HelloServiceConnection(IHelloServiceConnectionObserver observer, ContextWrapper contextWrapper){
this.observer = observer;
this.contextWrapper = contextWrapper;
}
Run Code Online (Sandbox Code Playgroud)
因此,让我更多地说明为什么这是这种特殊情况的正确答案.既然ContextWrapper是我无法控制的框架的一部分,我无法改变它.因为它也是几个类的祖先,我可能想要使用其中任何一个类,HelloServiceConnection所以扩展所有后代ContextWrapper来添加它并没有多大意义IHelloServiceConnectionObserver.
所以我以为我离开的时候this,this别无选择.一旦我理解了乔恩的回答,就可以节省一天的时间!
谢谢,乔恩 - 并感谢所有参与的人.
好吧,你可以使调用通用:
public <T extends ContextWrapper & IHelloServiceConnectionObserver> void method
(T item)
Run Code Online (Sandbox Code Playgroud)
然后让类型推断对其进行排序.虽然这不是非常愉快.
编辑:看起来你正在尝试使用构造函数,这将使它变得更难.您可以使用静态方法创建实例:
public static <T extends ContextWrapper & IHelloServiceConnectionObserver>
HelloServiceConnection createConnection(T value)
{
return new HelloServiceConnection(value, value);
}
private HelloServiceConnection(ContextWrapper wrapper,
IHelloServiceConnectionObserver observer)
{
this.wrapper = wrapper;
this.observer = observer;
}
Run Code Online (Sandbox Code Playgroud)
好的,所以构造函数和类型本身最终会有两个单独的字段 - 但我们知道它们都会引用同一个对象.如果你愿意,你甚至可以在构造函数中断言.
正如其他人所说,值得考虑的是你是否真的需要这种耦合.如果包装器和观察者不是同一个对象会发生什么坏事?
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |