对于大多数核心库和Java类,所有Java实现中的'toString'表示都是标准的.或者这在Java规范中没有指定.
例如,如果我这样做,新的HashMap()/ toString,OpenJDK的输出预计与IBM jrockit相同.
他们应该兼容吗?如果您将代码从一个JVM移植到另一个JVM并且期望字符串表示相同,则可能会出现问题.
方法的输出toString()(除了少数例外)是未指定的,因此理论上,不同的 Java 实现可能会有所不同。
然而,大多数商业Java 实现都具有派生自某些版本的 Sun / Oracle 类库的类库,无论是 OpenJDK 代码库还是早期版本。鉴于 Sun/Oracle 对故意进行可能破坏客户代码的更改持谨慎态度,我预计各自的toString()方法大部分是兼容的。
但也有一些值得注意的例外;例如,基于 GNU Classpath 库、Apache Harvest 库和... Android 的 java 实现。请注意,这些实现没有通过 Java 合规性测试(因为 Oracle 拒绝在可接受的条款下许可 TDK!),因此严格来说它们不能称为 Java(tm)。
最重要的是,对未记录 toString()格式的依赖可能会导致移植问题或升级 JVM 版本时出现问题。但实际上,出现问题的可能性很大程度上取决于您的移植来源和目标。如果您坚持使用使用 Oracle/Sun 派生类库的 JVM,出现问题的可能性很小。
那么你应该怎么做呢?
最极端的立场是避免使用toString方法(隐式或显式),除非指定了输出格式。但我认为这太过分了。(而且这项政策可能很难执行......)
更现实的立场是避免toString在精确输出格式很重要的情况下使用方法。换句话说:
不要toString()在对象序列化方案中使用...除非指定了格式。
如果您toString()在单元测试中使用,请注意您可能需要修复不可移植的单元测试作为移植工作的一部分。
| 归档时间: |
|
| 查看次数: |
242 次 |
| 最近记录: |