如何禁用Java Integer Cache?缓存外测试受阻问题求助
解决Java Integer Cache测试障碍的方法
首先得明确:你遇到的问题核心是Java默认对**-128到127**的Integer对象做了缓存,自动装箱(比如Integer i = 100;)或者调用Integer.valueOf()时,这个范围内的值会复用缓存里的对象,导致用!=比较对象引用时,即使值相同也会返回false——但你的主键一直没超过128,所以这个逻辑漏洞一直没暴露。
下面给你几个实用的方法来禁用/绕过缓存,方便测试:
修改JVM启动参数彻底禁用缓存
Java提供了-XX:AutoBoxCacheMax=<size>参数,用来调整Integer缓存的上限。如果把这个值设为0,就会完全禁用自动装箱的Integer缓存:java -XX:AutoBoxCacheMax=0 YourApplicationMainClass这样不管是哪个数值的自动装箱,都会生成新的Integer对象,你的
!=比较逻辑就会立刻暴露问题。测试代码中手动创建Integer对象
在你的测试用例里,不要依赖自动装箱,而是用new Integer()显式创建对象——这种方式不会走缓存,哪怕是127以内的值,每个都是独立的对象:// 测试用例里用这种方式生成主键 Integer testId = new Integer(50); // 即使是缓存范围内的值,也是新对象这样就能模拟出缓存范围外的对象引用比较场景,验证你的
!=逻辑是否存在问题。额外建议:从根源修复逻辑
当然,测试只是第一步,最终你应该把所有用!=比较Integer的代码改成值比较:// 推荐的正确写法 if (!Objects.equals(id1, id2)) { ... } // 或者 if (id1.intValue() != id2.intValue()) { ... }这样不管有没有缓存,都能保证比较的是数值本身,避免对象引用比较带来的坑。
内容的提问来源于stack exchange,提问作者ForguesR
相关产品推荐
相关产品推荐

