我应该在使用Jackson时使用包装器或原始类型作为字段

时间:2018-02-13 12:37:43

标签: java json object jackson primitive-types

我正在使用Jackson JSON解析器。我有简单的数据传输对象,应该通过REST服务返回。

public class PersonDto {

  private String name;
  private Integer age; // int?

  public PersonDto(String name, Integer age) {
      this.name = name;
      this.age = age;
  }

  public String getName() {
      return this.name;
  }

  public Integer getAge() {
      return this.age;
  }
}

在这种情况下,我是否应该将原始类型的包装类作为字段?除了包装器可以为空之外,这些方法中哪一个有更多优点?

2 个答案:

答案 0 :(得分:3)

包装类:java.lang.Integer

优点:

  • 允许null值,从而为用户提供留空/未指定字段的机会
  • 当值介于-128和127之间时快速,因为它使用内部缓存而不是创建新对象

  • Integer::valueOf用于解析String

缺点:

  • 不可变:如果您必须重置该值(例如:因为它超出了某个范围),您将不得不重新创建一个全新的Integer实例。

  • 计算性能较慢

  • java.lang.Integer是对实例的引用。每次计算都将重新创建一个全新的对象

原始类型:int

优点:

  • 可变(只要非finalsetter提供):轻松允许:this.age = age > MAX_AGE ? blabla : age;

  • 原始类型计算更快

  • Integer::parseInt用于解析String

缺点:

  • 未选中的值将自动设为0;这可能会造成用户选择0作为值,或者没有选择任何内容的混淆

似乎java.lang.Integer的唯一优势是blank / null值。

此外,在需要包装器的情况下,例如:

List<Integer> myList;

您可以直接添加一个未装箱的值myList.add(2);,编译器将其解释为myList.add(Integer.valueOf(2));

答案 1 :(得分:0)

我发现在DTO中使用包装器是有益的。使用Jackson,对于可空字段,您可以在DTO对象顶部设置 @JsonInclude(JsonInclude.Include.NON_NULL)并减少通过网络发送的数据数量(空字段)不会在结果JSON中出现),从而解决了值是否为0或不存在的歧义,告诉前端不存在任何节点,因此不需要处理/显示数据。 对于不可为空的数字数据,原始类型很好用。 同样,对于在算术计算中不应在前端使用的浮点数据,可以将String与在服务器端执行的舍入一起使用。我在REST API中多次看到了这种技术。

SomeRandomCard(onPressed: changeText, text: text, color: color,);