【发布时间】:2015-02-24 04:20:39
【问题描述】:
这是我的示例代码:
public class ExternalizableClass implements Externalizable
{
final int id;
public ExternalizableClass()
{
id = 0;
}
public ExternalizableClass(int i)
{
id = i;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException
{
out.writeInt(id);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
id = in.readInt();
}
@Override
public String toString()
{
return "id: " + id;
}
}
编译失败,因为id = in.readInt(); 给出了Error:(36, 5) java: cannot assign a value to final variable id。但是,我可以想到实际用例,其中不可变字段(例如 id)需要外部化,同时我们还希望保留其不变性。
那么解决这个问题的正确方法是什么?
【问题讨论】:
-
您可以将该字段封装在一个类中,然后在读取数据时创建该类的实例吗?除此之外,在构造实例之后重新初始化最终实例变量确实没有意义;这就是
final的重点 -
@VinceEmigh 但在这种情况下,我不会重新初始化对象。这是外化,所以我想将 obj 保存到文件并重新构建以供以后使用。
-
我知道,但是如果您真的需要该字段是最终的,那么如果您需要使用外部化来初始化该字段,那么您将无法实现。您总是可以在读取时实例化一个新对象,然后在写入时取消引用该对象。或者,你可以切换到
Serializable:“我怀疑你很难从使用现代 JVM 的 Externalizable 中获得有意义的好处。” - stackoverflow.com/a/818093/2398375
标签: java serialization deserialization serializable externalizable