3

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

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

类实例创建表达式:

new @Interned MyObject();

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

4

2 回答 2

3

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

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

于 2015-07-16T04:23:27.030 回答
1

这个特殊的注解似乎源自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。如果这些实现了,对象的可内部性将变得更加重要。

于 2015-07-16T04:46:24.943 回答