缓存可选<boolean>值</b​​oolean>

时间:2015-02-26 09:06:26

标签: java boolean java-8 optional

对于标准库中可用的Optional<Boolean>true值,似乎没有任何false类型的缓存对象。我在某处错过了吗?

如果没有这样的物体,我会感到惊讶,因为在我看来,这对于清晰度和性能来说都是如此有用。

如果确实没有这样的物体,为什么会这样?

2 个答案:

答案 0 :(得分:2)

在Java 8中,他们改进了对象创建的优化,特别是对于诸如Optional之类的短期对象。 JIT可以做的是使用Escape Analysis通过将字段放在堆栈上来消除短期对象。在Optional<Boolean>的情况下,这很可能不会超过boolean

请参阅以下有关对象消除的文章,如何检测它不起作用以及您可以对此做些什么。 Java Lambdas and Low Latency

相反的问题,是为什么有OptionalInt,OptionalLong和OptionalDouble?这些可能很有用,只是没有你想象的那么有用。与Boolean不同,并非所有IntegerLongDouble值都会被缓存,虽然Escape Analisys可以消除对象,但它很昂贵并且可能需要一段时间才能启动,可能从来没有代码运行得不够长。

答案 1 :(得分:1)

没有理由将特定的优化策略修复到API中。 Optional实例是通过工厂方法获取的,并且有关返回对象标识的行为是故意未指定的。

所以实现可以在内部有一个缓存工具,但也可能是JVM的优化器负责这些事情的情况。今天的JVM在可能的情况下已经在热点中进行了实例创建,但未来的JVM实现也可能为“value based classes”注入缓存或重复数据删除工具。

另见“Why should I not use identity based operations on Optional in Java8?”