相关疑难解决方法(0)

最终瞬态场和序列化

final transient在Java中进行序列化后,是否可以将字段设置为任何非默认值?我的用例是一个缓存变量 - 这就是它的原因transient.我也习惯于制作Map不会改变的字段(即地图的内容被改变,但是对象本身保持不变)final.但是,这些属性似乎是矛盾的 - 虽然编译器允许这样的组合,但我不能将字段设置为除了反null序列化之外的任何东西.

我尝试了以下内容,没有成功:

  • 简单字段初始化(在示例中显示):这是我通常所做的,但是在反序列化之后似乎没有发生初始化;
  • 在构造函数中初始化(我相信这在语义上与上面相同);
  • 分配字段readObject()- 因为字段是,所以无法完成final.

在该示例cachepublic仅用于测试.

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 …
Run Code Online (Sandbox Code Playgroud)

java serialization final

59
推荐指数
4
解决办法
2万
查看次数

在Java中将对象的临时成员反序列化为非null默认值

public class MyObj implements Serializable {
  private transient Map<String, Object> myHash = new HashMap<String, Object>();
  ...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法确保当上一个类的对象被反序列化时,成员myHash将被设置为一个新的空Map而不是设置为null?

java serialization

19
推荐指数
2
解决办法
9482
查看次数

对象vs字节[0]为锁

我之前评论过这个问题("为什么java.lang.Object不是抽象的?")说我听说使用byte[0]锁定比使用锁定更有效java.lang.Object.我确定我已经在某个地方读过这篇文章,但我不记得在哪里:有谁知道这是否真的如此?

我怀疑这是由于实例化byte[0]需要的字节码略少Object,尽管有人指出byte[0]需要额外的存储来存储长度字段,所以听起来这可能会否定任何好处.

java multithreading synchronization locking synchronized

4
推荐指数
3
解决办法
4681
查看次数