我正在使用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;
}
}
在这种情况下,我是否应该将原始类型的包装类作为字段?除了包装器可以为空之外,这些方法中哪一个有更多优点?
答案 0 :(得分:3)
包装类:java.lang.Integer
优点:
null
值,从而为用户提供留空/未指定字段的机会当值介于-128和127之间时快速,因为它使用内部缓存而不是创建新对象
Integer::valueOf
用于解析String
的
缺点:
不可变:如果您必须重置该值(例如:因为它超出了某个范围),您将不得不重新创建一个全新的Integer
实例。
计算性能较慢
java.lang.Integer
是对实例的引用。每次计算都将重新创建一个全新的对象
原始类型:int
优点:
可变(只要非final
和setter
提供):轻松允许:this.age = age > MAX_AGE ? blabla : age;
原始类型计算更快
Integer::parseInt
用于解析String
的
缺点:
似乎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,);