конечные переходные поля и сериализация
Возможно ли иметьfinal transient
поля, которые установлены в любое значение не по умолчанию после сериализации в Java? Мой случай использования - это переменная кеша, поэтомуtransient
, У меня также есть привычка делатьMap
поля, которые не будут изменены (т. е. содержимое карты изменилось, но сам объект остался прежним)final
, Тем не менее, эти атрибуты кажутся противоречивыми - хотя компилятор допускает такую комбинацию, я не могу установить в поле ничего, кромеnull
после десериализации.
Я попробовал следующее, но безуспешно:
простая инициализация поля (показано в примере): это то, что я обычно делаю, но инициализация, кажется, не происходит после десериализации;инициализация в конструкторе (я думаю, что это семантически то же самое, что и выше);назначение поля вreadObject()
- не может быть сделано, так как полеfinal
.В примереcache
являетсяpublic
только для тестирования.
import java.io.*;
import java.util.*;
public class test
{
public static void main (String[] args) throws Exception
{
X x = new X ();
System.out.println (x + " " + x.cache);
ByteArrayOutputStream buffer = new ByteArrayOutputStream ();
new ObjectOutputStream (buffer).writeObject (x);
x = (X) new ObjectInputStream (new ByteArrayInputStream (buffer.toByteArray ())).readObject ();
System.out.println (x + " " + x.cache);
}
public static class X implements Serializable
{
public final transient Map <Object, Object> cache = new HashMap <Object, Object> ();
}
}
Выход:
test$X@1a46e30 {}
test$X@190d11 null