Выполнить проверку возвращаемых значений интерфейса - PullRequest
2 голосов
/ 08 мая 2020

У меня есть базовый класс ClassA:

@Getter
@Setter
public ClassA {
   private String version;
}

Некоторые классы расширяют classA, например

@Data
public class B extends classA {
   private String a;
   private String b;
}

У меня есть интерфейс со следующим методом:

<T extends ClassA> T read(SomeOtherObject object, Class<T> clazz);

Теперь в реализации интерфейса

<T extends ClassA> T read(SomeOtherObject object, Class<T> clazz) {
   T obj = callSomeMethod(); //Call SomeMethod will return an object which fills in properties of T and doesn't know how to set value of version
   obj.setVersion("123");
   return obj;
}

Как мне убедиться, что каждая реализация этого интерфейса устанавливает непустое значение версии в ClassA?

1 Ответ

3 голосов
/ 08 мая 2020

Вы не можете сделать это с помощью интерфейсов. Вы можете достичь чего-то близкого, используя абстрактный класс вместо интерфейса

abstract class TheClass {
    public final <T extends ClassA> T read(SomeOtherObject object, Class<T> clazz) {
        T actual = this.doRead(object, clazz);
        if(null == actual.getVersion() || actual.getVersion().trim().isEmpty())
            throw SomeException();
    }

    protected abstract <T extends ClassA> T doRead(SomeOtherObject object, Class<T> clazz);
}

или заставив ClassA сам отклонять пустые version значения:

@Getter
public ClassA {
   private String version;

   public void setVersion(String v) {
       if(null == v || v.trim().isEmpty()) throw SomeException();
       this.version = v;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...