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

k13*_*13i 4 java json object primitive-types jackson

我正在使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我应该更喜欢包装类而不是原始类型作为字段吗?除了包装器可以为空之外,哪些方法具有更多优势?

Mar*_*cak 8

包装类: java.lang.Integer

优点:

  • 允许null值,因此给用户留下空白/未指定字段的机会
  • 当值在 -128 到 127 之间时速度很快,因为它使用其内部缓存而不是创建新对象

  • Integer::valueOf用于解析String

缺点:

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

  • 计算性能较慢

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


原始类型: int

优点:

  • 可变的(只要提供了 non-final和 a setter):很容易允许:this.age = age > MAX_AGE ? blabla : age;

  • 原始类型计算速度更快

  • Integer::parseInt用于解析String

缺点:

  • 未选择的值将自动设置为 0;这可能会混淆用户是选择 0 作为值,还是没有选择任何内容

似乎唯一的优点java.lang.Integerblank/null值。

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

List<Integer> myList;
Run Code Online (Sandbox Code Playgroud)

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