gpt4 book ai didi

java - Java如何检测比较器契约(Contract)违规?

转载 作者:行者123 更新时间:2023-11-30 07:00:22 32 4
gpt4 key购买 nike

令我惊讶的是,Java 有时可以为您检查比较器契约。

例如,当你写一个不遵循传递性的顺序关系时,你得到

java.lang.IllegalArgumentException: Comparison method violates its general contract!

如何检查这种违规行为? Java是如何实现的?


(如果你不知道我在说什么,请参阅 this question)

最佳答案

您没有明确说明何时您遇到此异常。我假设您在使用自己的 Collections.sort 作为参数进行 Comparator 调用时得到了这个,因为这是我能够在 Java 源代码中找到此错误的地方。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/TimSort.java#773

(TimSort 是用于 Collections.sort 的实现)

当您的 Comparator 不一致(compare(a,b) 的结果与 compare(b,a) 的结果不一致)或不稳定时 - 对于相同的输入不会返回相同的结果,您将在临时状态中得到内部不一致TimSort 方法保留。

算法检测到这种内部不一致并抛出异常:

772        } else if (len1 == 0) {
773 throw new IllegalArgumentException(
774 "Comparison method violates its general contract!");
775 }

注意当您的比较器违反契约(Contract)时,无法保证您会得到此异常(这对于您的比较器的单元测试来说很酷)。

对于您碰巧传递给对 Collections.sort 的特定调用的输入,它可能根本不是不正确的,或者您的 Comparator 的不一致输出可能根本不会导致 TimSort 方法中的内部不一致。在这种情况下,生成的排序顺序仍有可能不正确,但不保证会出现异常。

关于java - Java如何检测比较器契约(Contract)违规?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30678589/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com