用 getter/setter 实现嵌套抽象 class
implement nested abstract class with getter/setter
我有以下抽象class结构:
public abstract class A {
...
private List<B> b;
public List<B> getB() {
return b;
}
public void setB(List<B> b) {
this.b = b;
}
public static abstract class B {
}
}
并像这样实现它:
public class AA extends A {
public static class BB extends B {
...
}
当我现在使用 jackson 将 Json 映射到 AA 时,出现错误,它无法创建 A$B 的实例。我认为这是因为 A 中的 getter/setter 仍然引用 B 而不是 BB,这导致了错误。有什么办法可以做到这一点,而无需将 getter/setter 放入 subclass?
您可以添加类型捕获以确保 b 始终正确键入,如下所示:
public abstract class A<T extends A.B> {
...
private List<T> b;
public List<T> getB() {
return b;
}
public void setB(List<T> b) {
this.b = b;
}
public static abstract class B {
...
}
}
然后
public class AA extends A<AA.BB> {
...
public static class BB extends B {
...
}
如果你创建一个 AA
的实例,你需要一个抽象的实例 class B
并且你现在定义要使用的实例。仅提供一些实现 (BB
) 是不够的。
反序列化有多种选择。如果你没有注释,Jackson 可能会退回到使用最近的 superclass 的构造函数,它有一个 public 构造函数,没有参数。创建空对象后,它会使用反射设置字段。
- 反射将绕过构造函数中的任何验证,例如
Objects.requireNotNull
。
使用Jackson 的一种更精致的方式是在构造函数中使用@JsonCreator
和@JsonProperty
,命名所有参数。
- 这使您能够强制 Jackson 使用您创建的构造函数并验证对象。
我不太确定这个相当不寻常的结构。毕竟,你有一个抽象class嵌套在一个抽象class里,我见多了,但是没见过这样的。有充分的理由吗?或者将内部 class 移动到它自己的文件中不是问题吗? (毕竟是public static
)
我有以下抽象class结构:
public abstract class A {
...
private List<B> b;
public List<B> getB() {
return b;
}
public void setB(List<B> b) {
this.b = b;
}
public static abstract class B {
}
}
并像这样实现它:
public class AA extends A {
public static class BB extends B {
...
}
当我现在使用 jackson 将 Json 映射到 AA 时,出现错误,它无法创建 A$B 的实例。我认为这是因为 A 中的 getter/setter 仍然引用 B 而不是 BB,这导致了错误。有什么办法可以做到这一点,而无需将 getter/setter 放入 subclass?
您可以添加类型捕获以确保 b 始终正确键入,如下所示:
public abstract class A<T extends A.B> {
...
private List<T> b;
public List<T> getB() {
return b;
}
public void setB(List<T> b) {
this.b = b;
}
public static abstract class B {
...
}
}
然后
public class AA extends A<AA.BB> {
...
public static class BB extends B {
...
}
如果你创建一个 AA
的实例,你需要一个抽象的实例 class B
并且你现在定义要使用的实例。仅提供一些实现 (BB
) 是不够的。
反序列化有多种选择。如果你没有注释,Jackson 可能会退回到使用最近的 superclass 的构造函数,它有一个 public 构造函数,没有参数。创建空对象后,它会使用反射设置字段。
- 反射将绕过构造函数中的任何验证,例如
Objects.requireNotNull
。
使用Jackson 的一种更精致的方式是在构造函数中使用@JsonCreator
和@JsonProperty
,命名所有参数。
- 这使您能够强制 Jackson 使用您创建的构造函数并验证对象。
我不太确定这个相当不寻常的结构。毕竟,你有一个抽象class嵌套在一个抽象class里,我见多了,但是没见过这样的。有充分的理由吗?或者将内部 class 移动到它自己的文件中不是问题吗? (毕竟是public static
)