Java 状态测试方法与可分辨返回值

Java 状态测试方法与可分辨返回值,java,Java,在阅读有效的Java书籍时,我发现了这条指导原则 具有“依赖于状态”的方法且只能在某些不可预测的条件下调用的类通常应该具有 单独的“状态测试”方法,表明其是否合适 调用依赖于状态的方法。例如,迭代器 接口具有依赖于状态的方法next()和相应的 状态测试方法hasNext() 此外,还有一个指南可供选择 状态测试方法或可分辨返回值 书上说: 如果要在没有外部同步的情况下并发访问对象,或者要进行外部诱导的状态转换, 必须使用可分辨的返回值,因为对象的状态可以 调用状态测试之间的间隔变化 方法及其状

在阅读有效的Java书籍时,我发现了这条指导原则

具有“依赖于状态”的方法且只能在某些不可预测的条件下调用的类通常应该具有 单独的“状态测试”方法,表明其是否合适 调用依赖于状态的方法。例如,迭代器 接口具有依赖于状态的方法next()和相应的 状态测试方法hasNext()

此外,还有一个指南可供选择 状态测试方法可分辨返回值

书上说:

如果要在没有外部同步的情况下并发访问对象,或者要进行外部诱导的状态转换, 必须使用可分辨的返回值,因为对象的状态可以 调用状态测试之间的间隔变化 方法及其状态相关方法。在所有其他条件相同的情况下 状态测试方法略优于显著回报 价值它的可读性稍好一些,可能会导致错误使用 更容易检测:如果忘记调用状态测试方法 依赖于状态的方法将抛出异常,从而导致错误 明显的;如果忘记检查可分辨的返回值,则 错误可能很微妙


我的问题是,我发现状态测试方法和可分辨返回值之间没有区别。两者的目的相同。与遗忘状态测试方法检查相比,遗忘可分辨返回值检查是多么微妙?

状态测试与可分辨返回值的示例:

假设类似于原始引用中的
getNext()
,状态测试将类似于拥有
boolean hasNext()
,以及
Foo getNext()
,如果没有下一个要获取的元素,调用
getNext()
将抛出“无下一个对象异常”

对于可分辨返回值,它类似于如果没有下一个元素,
getNext()
将返回一个特殊值(例如null或空对象)

如果您忘记调用
hasNext()
,在没有next元素的情况下调用
getNext()
会给您带来明显的问题:将引发异常

但是,对于区分值的情况,如果忘记检查区分值,代码可能仍然有效:

Foo foo = bar.getNext();
// you should have something like if (foo != null) here
doSomethingWithFoo(foo);
somethingElseWithFoo(foo);

您可能会遇到一些微妙的错误,如NPE深陷
中的某个东西与foo(foo)
,或者更微妙的东西,具体取决于它的使用方式。

请编辑您的问题。1) 不要用粗体表示引号,请在引号前加上
。2) 使用空行分隔段落。您的问题解释了差异以及何时必须使用其中一个或另一个。请阅读。如果一个方法抛出异常,而您忘记捕获它,那么您的应用程序将崩溃。如果您在返回值中遇到错误,并且忘记检查它,那么您的应用程序将继续运行,而不会指示有问题。你看到区别了吗?@mikez你把画面弄清楚了