是否确定使用GSON实例作为一个模型bean(再利用)静态字段?是否确定使用GSON实例作为一个模型

2019-05-13 17:38发布

下面是我实现了模型:

public class LoginSession {
    private static final Gson gson = new Gson();

    private String id;
    private String name;
    private long timestamp;

    public LoginSession(String id, String name) {
        this.id = id;
        this.name = name;
        this.timestamp = System.currentTimeMillis();
    }

    public String toJson() {
        return gson.toJson(this);
    }

    public static LoginSession fromJson(String json) {
        checkArgument(!isNullOrEmpty(json));
        return gson.fromJson(json, LoginSession.class);
    }
}

我想了也没用,每LoginSession实例创建新GSON实例。

但是,我担心的是线程安全问题。 大约1000 +实例/秒将被创建。

是否确定使用GSON实例作为静态字段?

感谢您的任何意见/更正。

Answer 1:

这似乎只是罚款我。 没有什么在GSON情况下,使得它涉及到的特定实例LoginSession ,所以它应该是静态的。

GSON情况下应该是线程安全的 ,并有一个关于缺陷是它是固定的。



Answer 2:

核心Gson类是线程安全的。 我只是遇到与GSON是假想一个线程安全问题。 使用自定义的时候发生的问题JsonDeserializerJsonSerializerDate解析和格式化。 事实证明,线程安全问题是与我的方法的使用静态的SimpleDateFormat实例,它是不是线程安全的。 有一次,我裹静态SimpleDateFormat在一个ThreadLocal情况下,一切工作正常。



Answer 3:

根据现有的单元测试并没有真正考验太大的意见,要小心线程安全相关的东西...

有一个单元测试检查线程安全:

/**
 * Tests for ensuring Gson thread-safety.
 *
 * @author Inderjeet Singh
 * @author Joel Leitch
 */
public class ConcurrencyTest extends TestCase {
  private Gson gson;
  ...

你可能想知道,如果这个单元测试足以找到每一个可能的机器配置每一个可能出现的问题? 在此有何评论?

也有这句话在文档 :

在调用的Json操作GSON实例不保持任何状态。 所以,你可以自由地重用多个JSON序列化和反序列化操作同一个对象。



文章来源: Is it OK to use Gson instance as a static field in a model bean (reuse)?