首页 > 解决方案 > 执行接口返回值的验证

问题描述

我有一个基类 ClassA,它是:

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

很少有类扩展类A,例如

@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 中设置版本的非空值?

标签: javainterface

解决方案


你不能使用接口来做到这一点。您可以通过使用抽象类而不是接口来实现接近的目标

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;
   }
}

推荐阅读