Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据不断变化的字段需求扩展类_Java_Spring_Spring Boot - Fatal编程技术网

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)是什么意思?我只是添加它来查看完整的对象字符串。