我正在阅读 Oracle 的这份文档:https ://docs.oracle.com/javase/tutorial/java/annotations/basics.html
并遇到了这段关于类型注释的代码
类实例创建表达式:
new @Interned MyObject();
这是否意味着 Java8 或未来版本允许/将允许非 String/long/int 对象的实习?
我正在阅读 Oracle 的这份文档:https ://docs.oracle.com/javase/tutorial/java/annotations/basics.html
并遇到了这段关于类型注释的代码
类实例创建表达式:
new @Interned MyObject();
这是否意味着 Java8 或未来版本允许/将允许非 String/long/int 对象的实习?
据我所知,没有这样的计划。这只是一个如何使用注释的示例。我想它可以由像Lombok 项目这样的第三方注释处理器来实现,但我们不太可能在 JDK 中看到这样的特性(至少在不久的将来)。其他示例@Readonly
也只是示例,它们不应该添加到 JDK 中。
请注意,String.intern()
在用户代码中使用是非常糟糕的。现在它不像在 JDK6 中那么大的灾难,但它仍然很糟糕。您可以使用 轻松实现自己的对象池ConcurrentHashMap.putIfAbsent(obj, obj)
。
这个特殊的注解似乎源自Checker Framework ——Java 的可插入类型检查系统的实现(这本身就是一个非常有趣的概念)。来自 Checker Framework 文档:
如果 Interning Checker 没有为给定程序发出错误,则所有引用相等测试(即“==”的所有用法)都是正确的;也就是说, == 在应该使用 equals() 的地方没有被滥用。
实习是一种设计模式,其中只要两个不同的对象被认为是相等的,就会使用相同的对象。实习也称为规范化或散列consing,它与享元设计模式有关。实习有两个好处:它可以节省内存,并且可以通过允许使用 == 来加快相等性测试。
还有一点:
@Interned
indicates a type that includes only interned values (no non-interned values).
Checker 框架不是 Java 的正式组成部分,但它是由 Oracle 员工开发和推广的,因此在 Java 文档中看到这种稍纵即逝的提及也就不足为奇了。
您可以在Wikipedia中阅读有关该模式的更多信息。
请注意,有提议为 Java 中的纯值对象引入额外的语义,名为Project Valhalla。如果这些实现了,对象的可内部性将变得更加重要。