java - 执行接口返回值的验证
问题描述
我有一个基类 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 中设置版本的非空值?
解决方案
你不能使用接口来做到这一点。您可以通过使用抽象类而不是接口来实现接近的目标
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;
}
}
推荐阅读
- asp.net-mvc - 将模式(弹出表单)中的数据保存到本地数据库 - asp.net mvc
- python - 如何检查变量是否为整数?
- deepstream.io - 尝试通过 npm 安装 deepstream.io
- python - 在 Jupyter Notebook 上加载 plotly updatemenus 时,如何仅显示一个跟踪?
- vue.js - 如果在 vuejs 中第一次选择,则禁用日期
- java - 无法访问在 Java 中作为参数传递的部分字节数组
- grep - 使用正则表达式从 txt 文件中提取内容
- javascript - 从字符串中生成最多 32 个字节的 substirng
- php - 如何从 CodeIgniter 和 MySql 表中统计调查的房屋数量
- windows-10 - 未安装 SMB 服务