JDK类除了Javadoc之外还有其他任何规范吗?如果是这样,在哪里?
例如,考虑Collections.unmodifiableMap
。 Its Javadoc没有提及线程安全性;所以,从Javadoc开始,我不能认为将结果映射暴露给其他线程是安全的,而不需要采取我自己的一些特殊步骤来获得线程安全性。但是恕我直言,任何现实的实现都会将内部地图存储在final
字段中,所以在Java 5及更高版本中,只要内部地图是(带有“之前发生的”),结果地图就是线程安全的。生成的地图的任何访问与内部地图的任何先前修改之间的关系。这就是OpenJDK实现的功能,例如。
那么,我怎么能弄清楚我是否可以假设一个给定的行为?
答案 0 :(得分:10)
Javadoc是规范。也就是说,编写良好的规范是非常困难的,平衡两者并不会遗漏有用的东西而不会过度使用(并且会破坏未来发展实现的能力。)
如果我不得不猜测,我会说这个被排除在规范之外的原因(除了可能的疏忽)是任何线程安全都是有条件的,而不是基础集合(a)没有公布(b) )在创建不可修改的视图后不进行修改,这也必须仔细指定。
答案 1 :(得分:1)
最终,永远不会改变而可以改变下一个版本中的行为 恰好在您的平台上运行 EM>。即使指定的行为也可以弃用,然后在某些时候删除,它只是极少发生(例如Thread.destroy
)。因此,您是否可以依赖合理但未指定的行为取决于您需要多么强大的保证,您希望在防御性编码方面花费多少精力/添加测试以确保您检测到未来的变化等。
但是,是的,javadocs是你可以获得的最强保证,其他一切意味着进入更薄的冰。
许多项目依赖于API,这些API不仅没有文档,而且被认为是内部的,表面上是特定于实现的。 sun.misc.Unsafe
是这里的主要示例,其大部分功能在9中被称为适当的JDK API。
对于Collections.unmodifiableMap
,如果你想对安全发布真的保守,你可以在创建后插入商店围栏。