Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
Java 为什么我们需要快速故障和故障安全软件设计?_Java_Collections_Iterator_Fail Fast - Fatal编程技术网

Java 为什么我们需要快速故障和故障安全软件设计?

Java 为什么我们需要快速故障和故障安全软件设计?,java,collections,iterator,fail-fast,Java,Collections,Iterator,Fail Fast,我们知道Java具有快速失效和安全失效的迭代设计 我想知道,为什么我们基本上需要这些。这种分离有什么根本原因吗。这种设计的好处是什么 除了集合迭代,Java在其他任何地方都遵循这种设计 感谢对于程序员来说,如果代码中包含bug,那么尝试尽快失败是很有用的。最好是在编译时,但有时这是不可能的 因此,可以更早地检测到错误。否则,可能会发生错误未被检测到,并且包含在软件中多年,没有人注意到该错误的情况 因此,我们的目标是尽早发现错误和bug。因此,接受参数的方法应该立即检查它们是否在允许的范围内,这将

我们知道Java具有快速失效和安全失效的迭代设计

我想知道,为什么我们基本上需要这些。这种分离有什么根本原因吗。这种设计的好处是什么

除了集合迭代,Java在其他任何地方都遵循这种设计


感谢

对于程序员来说,如果代码中包含bug,那么尝试尽快失败是很有用的。最好是在编译时,但有时这是不可能的

因此,可以更早地检测到错误。否则,可能会发生错误未被检测到,并且包含在软件中多年,没有人注意到该错误的情况

因此,我们的目标是尽早发现错误和bug。因此,接受参数的方法应该立即检查它们是否在允许的范围内,这将是迈向快速失败的一步

这些设计目标无处不在,不仅仅是在迭代中,因为这是一个好主意。但有时你们想用可用性或其他因素来权衡

例如,
Set
实现允许
null
值,这是许多bug的根源。新的Java 9集合不允许这样做,并且在尝试添加这样的集合时立即抛出异常,这是fail fast


您的迭代器也是一个很好的例子。我们有一些快速失效的迭代器,它们不允许在迭代集合时修改集合。主要原因是它很容易成为错误的来源。因此,它们抛出一个
ConcurrentModificationException

在迭代的特殊情况下,需要有人指定应该如何工作。当一个新元素在迭代过程中出现或被删除时,迭代应该如何进行?在迭代中应该包括/删除它还是应该忽略它

例如,
ListIterator
提供了一个定义非常好的选项来迭代
List
,并对其进行操作。在这里,您只允许操作迭代器当前所在的对象,这使得它具有良好的定义

另一方面,有一些故障安全的迭代方法,比如使用
ConcurrentHashMap
。它们不会抛出此类异常并允许修改。然而,他们的工作是复制原始收藏,这也解决了“如何”的问题。因此,映射上的更改不会反映在迭代器中,迭代器在迭代时完全忽略任何更改。这会增加成本,每次迭代时都必须创建一个完整的副本


对我个人来说,这些故障安全变体不是一个选项。我使用fail fast变量并记住我想要操作的内容。迭代完成后,我执行那些记忆中的操作


这对于程序员来说不太舒服,但是您可以利用快速失败的优势。这就是我所说的可用性权衡。

“我们知道Java有fail-fast和fail-safe迭代设计”-我们有吗?fail-fast可以最大限度地减少在有故障的情况下可能造成的损害environment@JavaUser如果用户回答了您的问题,请同时接受他的回答()。如果没有,请说明还有什么问题没有回答,这是StackOverflow的一个非常关键的部分,非常感谢。