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));