今天我遇到了一个愚蠢的错误。我不得不比较2个字符串而我偶然使用了'=='。 (当您经常在可以使用'=='运算符比较字符串的语言之间切换时,这可能会发生很多)
我没有给予足够的重视,因为我认为单元测试会发现这样的问题。我不知道的是java tries to share strings to save memory
所以,没有单元测试失败(因为字符串是共享的),我继续编写代码。它的长短:一段时间后,我将这个方法与动态创建的字符串(new String("other string")
)一起使用,该字符串具有另一个id(哈希)而不是String s = 'other string'
。
有没有办法阻止Java在单元测试期间共享字符串。我不关心内存使用情况(在单元测试期间),因为代码工作更重要。
每次单元测试使用字符串时我都不想使用new String(...)
。
答案 0 :(得分:1)
所涉及的机制是“实习”,如下所述:https://stackoverflow.com/a/3451183/931925
简而言之,它由Java虚拟机(JVM)完成。我们可以想象使用专门用于此目的的虚拟机将脱离Java规范。但是,有必要在另一个符合规范的JVM上进行测试,以确保代码“随处运行”。
相反,适用于Java的良好自由静态分析工具(如PMD和FindBugs)可能更有助于在运行时检测此类错误。 (除了目的之外的其他目的,我也建议使用Checkstyle。)