我正在阅读Oracle的这些文档:https://docs.oracle.com/javase/tutorial/java/annotations/basics.html
并且遇到了关于类型注释的这段代码
类实例创建表达式:
new @Interned MyObject();
是否意味着Java8或未来版本允许/将允许非String / long / int对象的实习?
答案 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。如果这些实现,对象的内部性将变得更加重要。