在谷歌的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/