Расширение класса с изменением требований к полям - PullRequest
1 голос
/ 28 мая 2020

Давайте рассмотрим пример базового класса

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
   @JsonProperty("login")
   private String login;

   @JsonProperty("password")
   private String password;

   @JsonProperty("additionalData")
   private String additionalData;
}

и второго, который расширяет класс User

@Data
@NoArgsConstructor
@AllArgsConstructor
public class EnhancedUser extends User {
   @NotNull
   @JsonProperty("additionalData")
   private String additionalData;
}

I, но он не работает, потому что когда я создаю экземпляр EnhancedUser поле класса additionalData может быть нулевым. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вы понимаете, что на самом деле у вас есть 2 поля "additionalData"? Поскольку вы не можете переопределить поля, а просто скрыть их. И это вообще огромный антипаттерн ноно. Вы либо переименовываете свое поле, либо думаете о более подходящей реализации, например, о реализации этого logi c самостоятельно с аргументом конструктора и вызовом установщика дополнительных данных из вашего конструктора.

0 голосов
/ 28 мая 2020

Посмотрите:

public class Sample {
    public static void main(String[] args) {
        EnhancedUser enhancedUser = new EnhancedUser();
        enhancedUser.setAdditionalData("TAMU");
        enhancedUser.setLogin("ANY");
        enhancedUser.setPassword("ANY");
        System.out.println(enhancedUser);
        System.out.println(enhancedUser.getAdditionalData());
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class User {
        private String login;

        private String password;

        private String additionalData;
    }

    @EqualsAndHashCode(callSuper = true)
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString(callSuper = true)
    public static class EnhancedUser extends User {
        @NotNull
        private String additionalData;
    }
}

И результат println будет

Sample.EnhancedUser(super=Sample.User(login=ANY, password=ANY, additionalData=TAMU), additionalData=TAMU)
TAMU
...