Java 根据不断变化的字段需求扩展类
让我们来看一个基类示例Java 根据不断变化的字段需求扩展类,java,spring,spring-boot,Java,Spring,Spring Boot,让我们来看一个基类示例 @Data @NoArgsConstructor @AllArgsConstructor public class User { @JsonProperty("login") private String login; @JsonProperty("password") private String password; @JsonProperty("additionalData") private String additional
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@JsonProperty("login")
private String login;
@JsonProperty("password")
private String password;
@JsonProperty("additionalData")
private String additionalData;
}
第二个是扩展用户类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EnhancedUser extends User {
@NotNull
@JsonProperty("additionalData")
private String additionalData;
}
但它不起作用,因为当我创建EnhancedUser类的实例时,字段additionalData可以为空。
有什么想法吗?看:
公共类示例{
公共静态void main(字符串[]args){
EnhancedUser EnhancedUser=新的EnhancedUser();
enhancedUser.setAdditionalData(“TAMU”);
enhancedUser.setLogin(“任何”);
enhancedUser.setPassword(“任何”);
System.out.println(enhancedUser);
System.out.println(enhancedUser.getAdditionalData());
}
@资料
@诺尔格构装师
@AllArgsConstructor
公共静态类用户{
私有字符串登录;
私有字符串密码;
私有字符串附加数据;
}
@EqualsAndHashCode(callSuper=true)
@资料
@诺尔格构装师
@AllArgsConstructor
@ToString(callSuper=true)
公共静态类增强器扩展了用户{
@NotNull
私有字符串附加数据;
}
}
而println
的结果是
Sample.EnhancedUser(super=Sample.User(login=ANY, password=ANY, additionalData=TAMU), additionalData=TAMU)
TAMU
看:
公共类示例{
公共静态void main(字符串[]args){
EnhancedUser EnhancedUser=新的EnhancedUser();
enhancedUser.setAdditionalData(“TAMU”);
enhancedUser.setLogin(“任何”);
enhancedUser.setPassword(“任何”);
System.out.println(enhancedUser);
System.out.println(enhancedUser.getAdditionalData());
}
@资料
@诺尔格构装师
@AllArgsConstructor
公共静态类用户{
私有字符串登录;
私有字符串密码;
私有字符串附加数据;
}
@EqualsAndHashCode(callSuper=true)
@资料
@诺尔格构装师
@AllArgsConstructor
@ToString(callSuper=true)
公共静态类增强器扩展了用户{
@NotNull
私有字符串附加数据;
}
}
而println
的结果是
Sample.EnhancedUser(super=Sample.User(login=ANY, password=ANY, additionalData=TAMU), additionalData=TAMU)
TAMU
您是否意识到您实际上有两个字段“additionalData”?因为您不能覆盖字段,而只能隐藏它们。这是一个巨大的nono反模式。
要么重命名字段,要么考虑更合适的实现,比如使用构造函数参数和构造函数调用additionalData setter自己实现此逻辑 您是否意识到您实际上有两个字段“additionalData”?因为您不能覆盖字段,而只能隐藏它们。这是一个巨大的nono反模式。
要么重命名字段,要么考虑更合适的实现,比如使用构造函数参数和构造函数调用additionalData setter自己实现此逻辑 getter也是由lombok生成的吗?因为您可以覆盖setter并使用
@NotNull
对其进行注释,然后只需将其委托给附加数据的super
setter即可。请记住,字段不能被重写,但是方法Canal getter和setter是由@Data Annotation生成的。您只需自己编写该getter并用@NotNull
注释它的参数,这是可能的。您如何从EnhancedUser
创建实例?我能看一下吗。哦,你在构造函数上传递了值吗?getter也是由lombok生成的吗?因为您可以覆盖setter并使用@NotNull
对其进行注释,然后只需将其委托给附加数据的super
setter即可。请记住,字段不能被重写,但是方法Canal getter和setter是由@Data Annotation生成的。您只需自己编写该getter并用@NotNull
注释它的参数,这是可能的。您如何从EnhancedUser
创建实例?我能看一下吗。哦,你在构造函数上传递了值吗?这是因为使用@ToString(callSuper=true)你是什么意思?我添加它只是为了查看完整的对象字符串。这是因为使用@ToString(callSuper=true)是什么意思?我只是添加它来查看完整的对象字符串。