【发布时间】:2022-01-28 03:50:35
【问题描述】:
我反复看到类似下面的代码,其中空的构造函数被好心的开发人员删除(因为它似乎未使用),然后破坏了 Jackson 序列化(后来被测试捕获):
public class Person {
private String name;
private int age;
// appears unused – only used by Jackson
public Person() {}
// used in code
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
我正在考虑在空构造函数中添加@JsonCreator 注释,以更清楚地表明Jackson 使用构造函数来防止开发人员将其删除:
public class Person {
private String name;
private int age;
@JsonCreator // <--------
public Person() {}
// used in code
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
这是一个好主意还是会产生意想不到的后果(即,与无注释情况相比,语义发生了变化)?
或者@JsonCreator 的这种使用是一种反模式,并且有更好的方法来实现这一点(没有将类转换为记录)?
【问题讨论】:
-
我建议只使用评论以避免意外的副作用
-
我根本不认为它是一种反模式。它简洁地记录了空构造函数的用途,但更重要的是,可以轻松配置诸如 IntelliJ 之类的 IDE,以在存在特定注释时停止警告未使用的构造函数(以及方法、字段等)。无论您的测试是否应该发现这一点,在测试有价值之前就发现它。
-
@ControlAltDel cmets 没有成功,这就是我要问的原因。
-
“创建单元/集成测试并强制拉/合并请求运行这些测试”会是更好的方法。
-
这已经完成了。我问这个问题是因为我更喜欢防止错误而不是在运行测试后发现错误。
标签: java json serialization jackson