【发布时间】:2018-07-24 02:30:20
【问题描述】:
我需要让程序更具确定性:即重构它,以减少对运行的依赖。
一个可能的不确定原因是:使用 HashMap/HashSet/etc 和使用默认对象 hashCode() 的键。
关键是默认 Object 的 hashCode() 使用对内存中对象的实际引用,这意味着每次重新运行它都可能不同。
有没有一种好方法可以打印出所有没有重新定义 hashCode() 方法并被其哈希使用的类?
代码库非常庞大(高达数百 MB 的代码),有很多内部类、接口、抽象类等。找出需要关注的映射/集合本身就是一个问题
【问题讨论】:
-
您可以编写 Java 代码,将所有 .java 文件作为测试文件读取并搜索
public int hashCode()。 -
如果要使用您的代码库,建议使用 LinkedHashMap/Set 而不是 HashMap 等。这些至少以可预测的顺序迭代。
-
看看Reflections library。我不知道它是否满足您的特定用例,但至少它会是一个很好的近似值。
-
Object.hashCode多年来一直没有使用对象的内存地址,尽管文档仍然提到它。相反,它使用伪随机数生成器。由于伪随机状态取决于调用了哪些对象以及调用了多少个对象 hashCode,这可能会导致不确定的行为。 -
Intellij 的“结构搜索”可能可以用于此。
标签: java collections java-8 java-7 deterministic