【发布时间】:2023-03-12 18:35:01
【问题描述】:
在 Google 的article on communicating with Fragments 中,作者给出了以下示例来检查片段的调用活动是否实现了所需的接口:
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
通常,我更喜欢显式检查而不是 try/catch 块。在这种情况下,我认为以下示例更可取:
if (activity instanceof OnHeadlineSelectedListener) {
mCallback = (OnHeadlineSelectedListener) activity;
} else {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
是否有理由更喜欢一种检查策略而不是另一种?在定义 Fragments 的接口时是否应该使用另一种策略?
【问题讨论】:
-
您可以只进行裸转换,既没有 instanceof 也没有 try/catch,并相信转换正常抛出的异常将包含您需要的信息。
-
我同意这个检查似乎不是绝对必要的,但谷歌推荐它,所以我很好奇他们的模式是否有特别的优势。
-
我个人不使用这样的检查,因为如果我编写好的代码,那么这个错误将永远不会发生。
try{}catch{}选项的一个可能原因是在 catch 块中抛出异常比在else中更有意义。但实际上,无论如何,抛出异常是处理生产错误的错误方法。 -
从不,但从不,使用异常作为控制程序流的一种方式。这是糟糕的设计,并且会产生无法维护的意大利面条式代码。
-
查看this question 和相关的。如果它实现了接口,那么它必须实现方法。
标签: java android android-fragments