在Java 8中实现非String(非int / long)对象的实现

时间:2015-07-16 04:14:26

标签: java java-8 string-interning

我正在阅读Oracle的这些文档:https://docs.oracle.com/javase/tutorial/java/annotations/basics.html

并且遇到了关于类型注释的这段代码

类实例创建表达式:

new @Interned MyObject();

是否意味着Java8或未来版本允许/将允许非String / long / int对象的实习?

2 个答案:

答案 0 :(得分:3)

据我所知,没有这样的计划。它只是一个如何使用注释的例子。我想它可以由第三方注释处理器实现,如project Lombok,但我们不太可能在JDK中看到这样的功能(至少在不久的将来)。其他示例如@Readonly也只是示例,它们不应该添加到JDK。

请注意,在用户代码中使用String.intern()非常糟糕。现在它不是像JDK6那样大的灾难,但它仍然很糟糕。您可以使用ConcurrentHashMap.putIfAbsent(obj, obj)轻松实现自己的对象池。

答案 1 :(得分:1)

这个特殊的注释似乎源于Checker Framework - 一个用于Java的pluggable type checking系统的实现(这本身就是一个非常有趣的概念)。来自Checker Framework文档:

  

如果Interning Checker没有为给定的程序发出错误,那么所有引用相等性测试(即所有使用“==”)都是正确的;也就是说,==在使用equals()时不会被误用。

     

实习是一种设计模式,只要两个不同的对象被认为是相同的,就会使用相同的对象。实习也称为规范化或散列制,它与flyweight设计模式有关。实习有两个好处:它可以节省内存,并且可以通过允许使用==来加速测试的平等性。

以下一点:

@Interned
    indicates a type that includes only interned values (no non-interned values).

Checker Framework并不是Java的正式组成部分,但它是由Oracle员工开发和推广的,所以在Java文档中看到这种短暂的提及就不足为奇了。

您可以在Wikipedia中详细了解相关模式。

请注意,有些建议是为Java中的仅值对象引入其他语义,名称为Project Valhalla。如果这些实现,对象的内部性将变得更加重要。