Возможно ли иметь поля final transient
, заданные для любого значения, отличного от значения по умолчанию после сериализации в Java? Мой usecase - это переменная кэша, поэтому она transient
. У меня также есть привычка создавать поля Map
, которые не будут изменены (т.е. Содержимое карты изменяется, но сам объект остается тем же) final
. Однако эти атрибуты кажутся противоречивыми - в то время как компилятор допускает такую комбинацию, я не могу установить поле, отличное от null
после unserialization.
Я пробовал следующее, без успеха:
- простая инициализация поля (показана в примере): это то, что я обычно делаю, но инициализация, похоже, не происходит после unserialization;
- инициализация в конструкторе (я считаю, что это семантически то же самое, что и выше);
- присвоение поля в
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> ();
}
}
Вывод:
[email protected] {}
[email protected] null