Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用Jackson时,我应该使用包装器还是基本类型作为字段_Java_Json_Object_Jackson_Primitive Types - Fatal编程技术网

Java 在使用Jackson时,我应该使用包装器还是基本类型作为字段

Java 在使用Jackson时,我应该使用包装器还是基本类型作为字段,java,json,object,jackson,primitive-types,Java,Json,Object,Jackson,Primitive Types,我正在使用JacksonJSON解析器。我有一个简单的数据传输对象,它应该通过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

我正在使用
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;
  }
}

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

包装器类:
java.lang.Integer

优点:

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

  • Integer::valueOf
    用于解析
    字符串

缺点:

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

  • 较慢的计算性能

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


基本类型:
int

优点:

  • 可变(只要非
    final
    ,并且提供了
    setter
    ):轻松允许:
    this.age=age>MAX\u age?布拉布拉:年龄

  • 基元类型计算速度更快

  • 用于解析
    字符串的
    Integer::parseInt

缺点:

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

java.lang.Integer
的唯一优点似乎是
空值

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

List<Integer> myList;
列出myList;

您可以直接添加一个未绑定的值
myList.add(2)myList.add(Integer.valueOf(2))

我发现在DTO中使用包装器是有益的。使用Jackson,对于可空字段,您可以在DTO对象的顶部设置@JsonInclude(JsonInclude.Include.NON_NULL),并减少通过网络发送的数据数量(生成的JSON中不会出现空字段),从而解决值为0或不存在时的歧义,告诉前端不存在节点,因此不需要处理/显示数据。 对于不可为空的数值数据,primitive运行良好。 此外,对于算术计算中不应该在前端使用的浮点数据,可以使用在服务器端执行舍入的字符串。我在RESTAPI中多次看到这种技术

    DecimalFormat df = new DecimalFormat("#.####");
    df.setRoundingMode(RoundingMode.CEILING);
    System.out.println(df.format(d));