【发布时间】:2014-05-18 13:31:13
【问题描述】:
今天我遇到了一个愚蠢的错误。我不得不比较 2 个字符串,我不小心使用了 '=='。 (当您经常在可以使用“==”运算符比较字符串的语言之间切换时,这种情况经常发生)。
我没有给予足够的关注,因为我认为单元测试会检测到这样的问题。我不知道的是java tries to share strings to save memory。
因此,没有一个单元测试失败(因为字符串是共享的),我继续编写代码。总而言之:一段时间后,我将这个方法与一个动态创建的字符串 (new String("other string")) 一起使用,该字符串的 id (hash) 不同于 String s = 'other string'。
有什么方法可以防止 Java 在单元测试期间共享字符串。我不关心内存使用情况(在单元测试期间),因为它对代码的工作更重要。
我不想每次单元测试使用字符串时都使用new String(...)。
【问题讨论】:
-
静态代码分析工具对这些场景有很大帮助
-
这里解释一下所涉及的机制:stackoverflow.com/a/3451183/931925
-
@Matt3o12 当然,pmd.sourceforge.net,findbugs.sourceforge.net,www.sonarqube.com
-
如果字符串字面量在同一个类中,无论发生什么,它们都会被共享。
-
(Java 应该做的是不允许在引用之间使用
==,而是需要一些其他符号(某些语言使用===),以便使用@987654328 @ 将是一个编译错误。但那是大坝下/桥上的水。)
标签: java string unit-testing compare