【发布时间】:2015-12-17 15:05:00
【问题描述】:
我们都同意使用 instanceOf 通常不是最好的解决方案。网络上有很多例子。
但是让我们考虑一下下面的例子,我们需要从一个片段调用一个方法到它的活动:
public class BaseActvity extends FragmentActivity implements ISomething {
@Override
public void doSomething();
}
然后假设我们在应用中有一个片段需要调用doSomething():
public MyFragment extends Fragment() {
public void onCreate() {
public void onResume() {
Activity activity = getActivity();
if (activity != null && activity instanceOf ISomething) {
ISomething something = (ISomething) activity;
something.doSomething();
}
}
}
public interface ISomething {
void doSomething();
}
如您所见,我们不能保证 getActivity() 将返回 ISomething 的对象,因此我们检查类型。一个改进是添加一个接口,但我们仍然会检查 getActvity() 返回类型以保护我们的代码。
由于 Android 框架的性质和 getActivity() 调用,我找不到更好的解决方案。也许有人可以提供一些意见..
注意:我添加了一个界面来遵循访问者模式。请注意,我仍然必须使用 instanceOf 来确保父 Activity 正在实现它。
谢谢。
加斯帕·德·埃莱斯
【问题讨论】:
-
你可以使用 EventBus: github.com/greenrobot/EventBus
-
'我们都同意使用 instanceOf 通常不是最好的解决方案。 '。 ?不,我没有。
-
@greenapps 在过去,使用 instanceOf 有两个缺点:1.效率不高,2.如果我们忘记在某个类中实现某些接口,您可能会导致崩溃或隐藏问题。问题 #1 已通过现代 JVM/JIC 优化 (stackoverflow.com/questions/103564/…) 解决,但 #2 仍然是一个问题。如果可能,一个好的设计可以在编译时检测到 #2,比如使用访问者模式:stackoverflow.com/questions/8841577/…
标签: android instanceof