Вот мой пример кода:экстернализовать конечный экземпляр переменной
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 в файл и перестроить его для последующего использования. – OneZero
Я знаю, но если вам действительно нужно, чтобы поле было окончательным, вы не достигнете этого, если вам нужно инициализировать поле, используя экстернализацию. Вы всегда можете создавать новый объект при чтении, а затем разыскивать объект при записи. Или вы можете переключиться на «Serializable»: «* Я подозреваю, что вам будет трудно получить значимую выгоду от Externalizable с помощью современной JVM. *" - http://stackoverflow.com/a/818093/2398375 –