Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法避免在Android中使用instanceOf?_Android_Instanceof - Fatal编程技术网

有没有办法避免在Android中使用instanceOf?

有没有办法避免在Android中使用instanceOf?,android,instanceof,Android,Instanceof,我们都同意,instanceOf的使用通常不是最好的解决方案。网络上有很多例子 但请考虑下面的例子,在这里我们需要将一个方法从一个片段调用到它的活动: public class BaseActvity extends FragmentActivity implements ISomething { @Override public void doSomething(); } 然后假设应用程序中有一个片段需要调用doSomething(): 如您所见,我们不能保证getActiv

我们都同意,instanceOf的使用通常不是最好的解决方案。网络上有很多例子

但请考虑下面的例子,在这里我们需要将一个方法从一个片段调用到它的活动:

public class BaseActvity extends FragmentActivity implements ISomething {
    @Override
    public void doSomething();
}
然后假设应用程序中有一个片段需要调用
doSomething()

如您所见,我们不能保证getActivity()将返回ISomething对象,因此我们检查类型。一个改进是添加一个接口,但我们仍然需要检查getActivity()返回类型以保护代码

由于Android框架和getActivity()调用的性质,我找不到更好的解决方案。也许有人可以提供一些帮助

注意:我添加了一个遵循访问者模式的界面。请注意,我仍然必须使用instanceOf来确保父活动正在实现它

多谢各位


Gaspar de Elais

您可以查看访客模式。是一个解释和一些Java代码。

如果您是正确的,那么最好在
片段中定义一个接口,并要求
活动来实现它。然后,在
onAttach()
中,您将
活动
投射到
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开发者主站点上的
片段
页面中推荐/描述的内容:

您可以使用EventBus:“我们都同意instanceOf的使用通常不是最好的解决方案。”?不,我不知道。@greenapps在过去,使用instanceOf有两个缺点:1。效率不高,2。如果我们忘记在某个类中实现某个接口,那么最终可能会导致崩溃或隐藏问题。问题1通过现代JVM/JIC优化()解决了,但问题2仍然是个问题。如果可能,一个好的设计可以在编译时检测到#2,比如使用访问者模式:谢谢,我已经添加了一个接口,但仍然使用instanceOf。从您的角度来看,捕获异常和instanceOf的优势是什么?效率?代码易读性?抛出RuntimeException似乎是在散列IMHO。通过使用异常,您正在强制执行您想要的:任何使用此
片段的
活动
都必须支持该接口。您可以对
instanceOf
执行相同的操作,如果失败,只需抛出异常即可。就性能而言,这两种方法都使用反射形式,但异常的代价更高,因为它必须创建新对象。就可读性而言,异常更为明显,因为这是预期的使用模式。您是对的,您在onAttach中抛出异常,这很有意义,谢谢。我将把问题标记为已回答。干杯。不幸的是,在这种特殊情况下,Activity类是一个系统类,而引用是通过调用
getActivity()
获得的,因此无法避免instanceOf/或/ClassCastException catch块。正如您所看到的,我已经更新了代码,以便使用interface ISomething使用访问者模式,但是我们仍然存在cast问题。
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");
        }
    }
}