java - Android Activity 接口(interface)到 Fragments : try/catch blocks vs. instanceof 检查

标签 java android android-fragments

在谷歌的article on communicating with Fragments ,作者给出了以下检查以确定 fragment 的调用 Activity 是否实现所需接口(interface)的示例:

try {
    mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
    throw new ClassCastException(activity.toString()
        + " must implement OnHeadlineSelectedListener");
}

通常,我更喜欢显式检查而不是 try/catch block 。在这种情况下,我认为以下示例更可取:

if (activity instanceof OnHeadlineSelectedListener) {
    mCallback = (OnHeadlineSelectedListener) activity;
} else {
    throw new ClassCastException(activity.toString()
        + " must implement OnHeadlineSelectedListener");
}

是否有理由偏爱一种检查策略而不是另一种?在定义 Fragment 的接口(interface)时是否应该使用另一种策略?

最佳答案

Is there a reason to prefer one checking strategy over the other?

主要只是个人喜好。 instanceof 对于阅读您代码的人来说更明确。 try{}catch{} 在功能上做同样的事情

Is there another strategy that should be used when defining interfaces to Fragments?

我不知道。

进一步的解释:(因为我想胡说八道)

应该不是“意外”的问题。如果你的代码写得好,你永远不应该担心这个错误。(忽略这个,回应 OP 的评论)

另外值得一提的是,Google 推荐的抛出新错误的方法添加了不必要的代码,因为默认异常将包含您需要的信息。此外,抛出错误会造成糟糕的用户体验。

任一选项的性能影响都可以忽略不计(除非您正在做一些不合理的事情,例如循环和检查数千次),因此(性能方面)您可以使用适合您喜欢的编码风格的任何一个。

我的猜测是 Google 推荐使用 try{} catch{} 选项,因为从 catch block 中抛出异常比从 中抛出异常更有意义否则。可能也是因为那篇文章的作者个人更喜欢 try{}catch{} 风格。

在功能上,这两种方法做同样的事情。 instanceof 检查是,但是其含义更加明确,因为代码清楚地说明了您要检查的内容以及如果您必须进行检查, 我建议使用 instanceof 方法。

关于java - Android Activity 接口(interface)到 Fragments : try/catch blocks vs. instanceof 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28568573/

相关文章:

java - 具有显式类型构造函数的泛型类

android - 我如何与接受它的其他应用程序共享数据/文本?

android - 没有从 11 api 到更低版本的端口 fragment

java - EditText 值未反射(reflect)出来,它显示以前的值,但是当您打印 EditText 的 getText 时,它显示正确的值

android - onclick 按钮没有获取 api 的编辑文本字符串

java - 矩阵旋转

java - 为什么这个 for 循环在 java 中不起作用?

java.util.Properties 多个值 ArrayIndexOutOfBoundsException

android - KSOAP: "org.ksoap2.serialization.SoapPrimitive"异常问题

java - Android FaceDetector 始终返回检测到的人脸数等于 0