当前位置: 首页 > 面试题库 >

我应该将Jackson的ObjectMapper声明为静态字段吗?

干善
2023-03-14
问题内容

杰克逊图书馆的ObjectMapper班级似乎是线程安全的。

这是否意味着我应该ObjectMapper像这样将我声明为静态字段?

class Me {
    private static final ObjectMapper mapper = new ObjectMapper();
}

而不是像这样的实例级字段?

class Me {
    private final ObjectMapper mapper = new ObjectMapper();
}

问题答案:

是的,建议您这样做是安全的。

您所引用页面的唯一警告是,共享器一旦被共享便无法修改。但您不更改配置,这样就可以了。如果确实需要更改配置,则可以从静态块执行此操作,也可以。

编辑 :(2013/10)

在2.0及更高版本中,可以通过注意到还有一种更好的方法来增强上述功能:使用ObjectWriterObjectReader对象,可以使用构建对象ObjectMapper。它们是完全不变的,线程安全的,这意味着从理论上讲甚至不可能导致线程安全问题(ObjectMapper如果代码尝试重新配置实例,则可能会发生此问题)。



 类似资料:
  • 问题内容: 我在代码中使用Java Callable Future。以下是我使用future和callables的主要代码- 下面是我的Task类,该类实现Callable接口,我需要根据所拥有的主机名生成URL,然后使用调用SERVERS RestTemplate。如果第一个主机名中有任何异常,那么我将为另一个主机名生成URL,然后尝试拨打电话。 所以我的问题应该声明RestTemplate为静

  • 问题内容: 编译错误: 解决办法? 问题答案: Java不允许您在函数局部内部类内定义非最终静态字段。只允许顶级类和静态嵌套类具有非最终静态字段。 如果您要在班级中添加一个字段,请将其放在班级级别,如下所示:

  • 问题内容: 我有以下课程: 是否可以使用反射仅获取静态字段的列表?我知道我可以使用来获得所有字段的数组。但是似乎无法确定实例是否代表静态字段。 问题答案: 您可以这样做:

  • 问题内容: 为什么将Java常量声明为static? 在此我了解使用final吗?购买为什么它必须是静态的?为什么它应该是类变量,而不是实例变量? 问题答案: 如果它可以随类的实例而变化,那么显然它不是 常数 。为的每个实例获得不同的pi值意味着什么(甚至不允许构造实例)?还是每个实例的大小写不区分大小写?

  • 问题内容: 我有一些经常被调用的代码,将它们声明为变量是否有意义? 在这种情况下将动态参数传递给方法是否安全? 问题答案: 不, 它们不是线程安全的,请改用Joda-time的版本 。 或者将它们包装在同步方法中,并使其成为线程安全的 博士说得很清楚 日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一种格式,则必须在外部进行同步。

  • 我应该在Java EE中将注入的变量声明为瞬态变量吗? 我收到FindBugs警告: 类com.playaround.HelloServlet定义了非瞬态非序列化实例字段加速单元 这个序列化类定义了一个非基元实例字段,它既不是瞬态的、序列化的,也不是java.lang.的对象,并且看起来没有实现外部化接口或readObject()和WriteObject()方法。 如果非序列化对象存储在这个字段中