在Java 5之前,没有注释。因此,您无法将元数据添加到类中。
要将类标记为可序列化,您必须实现Serializable接口(就是这个,标记)并使用更多transient
关键字将字段标记为不可序列化(如果需要)像:
public class MyClass implements Serializable {
...
private transient Bla field;
...
}
现在你理论上可以使用注释(这对他们来说是完美的用途)并且有:
@Serializable
public class MyClass {
...
@Transient
private Bla field;
...
}
但是不推荐使用接口和关键字,并且在Java 5中没有添加注释来替换它们。
保留界面和关键字的决定有哪些注意事项?
当然,存在与Java 5之前的代码兼容的问题,但在某些时候将会结束(例如,与泛型的新功能相关,JLS指定It is possible that future versions of the Java programming language will disallow the use of raw types)。那么为什么不为序列化注释做好准备?
有什么想法? (虽然我更喜欢具体的参考文献:我无法找到的D)
答案 0 :(得分:21)
接口就在那里,因此可以定义方法来接受Serializable类型的对象:
public void registerObject(Serializable obj);
答案 1 :(得分:10)
当然,存在与Java 5之前代码兼容的问题......
是。这是问题的根源。
如果他们{(1)}(例如)Java 5中的@deprecated
接口,那么许多旧的Java 5之前的代码会发出警告(或者错误取决于编译器开关)。
使用Serializable
并且“强迫”人们替换它实际上并没有什么问题是令人讨厌的。 (人们有更好的事情要做......)
当人们在代码中“修复”它时,它将不再使用Java 5之前的编译器进行编译,或者在Java 5之前的JVM上运行。
做一些让编译器系统地“哭狼”的事情是个坏主意。
......但在某些时候会结束。
实际上,实际发生的可能性很小(IMO)。据我所知,Sun / Oracle 从未删除了已弃用的功能。甚至不像Serializable
和朋友那样危险。
作为一个脚注,Go开发人员正在采取不同的方法解决这个问题。当他们想要更改语言或库功能时,他们就会这样做。它们提供了converter,可以根据需要自动重写代码。
答案 2 :(得分:2)
Serializable
和transient
确实是两件可以被注释取代的东西。
它们之所以没有被弃用,可能是因为有一个很多的程序使用Serializable
,如果开发人员突然开始喷出数千个,那么对于数百万人来说它会很烦人弃用警告。
标准Java API中还有很多其他东西可以在很久以前被弃用 - 例如,遗留集合类Vector
和Hashtable
(我相信你很容易找到更多的东西)。还有其他一些可以使用注释实现的内容(例如关键字volatile
,strictfp
和synchronized
)。
答案 3 :(得分:-1)
弃用适用于有害的事物。你所建议的是强迫八年现有Java代码的作者(当时)重写它,没有任何好处,只是为了关闭弃用编译器警告,回到他们用Java 1.4完全正确的代码。这没用。