【问题标题】:Java don't 'share' stringsJava 不“共享”字符串
【发布时间】: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,f​​indbugs.sourceforge.net,www.sonarqube.com
  • 如果字符串字面量在同一个类中,无论发生什么,它们都会被共享。
  • (Java 应该做的是不允许在引用之间使用==,而是需要一些其他符号(某些语言使用===),以便使用@987654328 @ 将是一个编译错误。但那是大坝下/桥上的水。)

标签: java string unit-testing compare


【解决方案1】:

所涉及的机制是“实习”,如下所述:https://stackoverflow.com/a/3451183/931925

简而言之,它是由 Java 虚拟机 (JVM) 完成的。我们可以想象使用专门用于此目的的虚拟机将背离 Java 规范。但随后有必要在另一个符合规范的 JVM 上进行测试,以确保代码将“在任何地方运行”。

相反,PMD 和 FindBugs 等优秀的 Java 免费静态分析工具可能更有助于在运行前检测此类错误。 (除了这里的目的,我还建议使用 Checkstyle。)

【讨论】:

  • 你不能阻止类加载器对字符串的实习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2019-07-29
  • 1970-01-01
相关资源
最近更新 更多