我需要使程序更具确定性:即重构它,以便结果更少依赖于运行。
可能的非确定性原因之一是:使用 HashMap/HashSet/etc 以及使用默认对象 hashCode()
的键。
重点是默认对象的 hashCode()
使用对内存中对象的实际引用,这意味着每次重新运行它都可能不同。
有没有一种好方法可以打印出所有没有重新定义 hashCode()
方法并由其哈希使用的类?
代码库巨大(高达数百MB的代码),有很多内部类、接口(interface)、抽象类等。并且弄清楚要关注哪些映射/集合本身就是一个问题
最佳答案
您的前提“我需要制作一个更具确定性的程序”存在根本缺陷。您的程序要么是正确的,要么是损坏的。如果它依赖于未指定的属性,那么它就会被破坏,并且尝试使其“不那么破坏”是没有意义的。你必须修复错误的部分。
例如,无论您如何实现 hashCode()
方法,依赖 HashMap
或 HashSet
的迭代顺序总是会被破坏。正如 this answer 所演示的,相同内容的 HashSet
可以显示其元素的不同顺序,具体取决于其实际容量(集合历史记录的函数)或实际 Java 运行时版本,尽管包含元素有一个 well defined hashCode()
implementation 。
因此,混杂类的 hashCode()
方法不会改进您的应用程序,您必须修复错误依赖返回数字的部分(并且可能依赖其他未指定的实现)详细信息)。
关于java - 查找没有哈希码的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48771571/