有什么办法可以避免在 Android 中使用 instanceOf 吗?
Is there any way to avoid the use of instanceOf in Android?
我们都同意使用 instanceOf 通常不是最佳解决方案。网上有很多例子。
但是让我们考虑一下下面的例子,我们需要从一个片段调用一个方法到它的 activity:
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() 将 return 成为 ISomething 的对象,因此我们检查类型。一个改进是添加一个接口,但我们仍然会检查 getActvity() return 类型以保护我们的代码。
由于 Android 框架和 getActivity() 调用的性质,我找不到更好的解决方案。也许有人可以提供一些帮助..
注意:我添加了一个界面来遵循访问者模式。请注意,我仍然必须使用 instanceOf 来确保父级 activity 正在实现它。
谢谢。
加斯帕德埃莱斯
你可以看看访问者模式。 Here 是解释和一些 Java 代码。
你是对的,最好在你的 Fragment
中定义一个接口并要求 Activity
来实现它。然后,在你的 onAttach()
中你将你的 Activity
投射到 try/catch
中的接口,如果它抛出 ClassCastException
你可以抛出你自己的异常。
public MyFragment extends Fragment {
private Callback mCallback;
public interface Callback {
void doSomething();
}
...
@Override
public void onAttach(Activity activity) {
try {
mCallback = (Callback)activity;
} catch (ClassCastException e) {
throw new IllegalArgumentException("Activity must implement Callback");
}
}
}
事实上,这就是 Android 开发者网站 Fragment
主页面中 recommended/described 的内容:http://developer.android.com/training/basics/fragments/communicating.html
我们都同意使用 instanceOf 通常不是最佳解决方案。网上有很多例子。
但是让我们考虑一下下面的例子,我们需要从一个片段调用一个方法到它的 activity:
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() 将 return 成为 ISomething 的对象,因此我们检查类型。一个改进是添加一个接口,但我们仍然会检查 getActvity() return 类型以保护我们的代码。
由于 Android 框架和 getActivity() 调用的性质,我找不到更好的解决方案。也许有人可以提供一些帮助..
注意:我添加了一个界面来遵循访问者模式。请注意,我仍然必须使用 instanceOf 来确保父级 activity 正在实现它。
谢谢。
加斯帕德埃莱斯
你可以看看访问者模式。 Here 是解释和一些 Java 代码。
你是对的,最好在你的 Fragment
中定义一个接口并要求 Activity
来实现它。然后,在你的 onAttach()
中你将你的 Activity
投射到 try/catch
中的接口,如果它抛出 ClassCastException
你可以抛出你自己的异常。
public MyFragment extends Fragment {
private Callback mCallback;
public interface Callback {
void doSomething();
}
...
@Override
public void onAttach(Activity activity) {
try {
mCallback = (Callback)activity;
} catch (ClassCastException e) {
throw new IllegalArgumentException("Activity must implement Callback");
}
}
}
事实上,这就是 Android 开发者网站 Fragment
主页面中 recommended/described 的内容:http://developer.android.com/training/basics/fragments/communicating.html