目前需要写一个判断完整度的方法
A实体类共有20个字段,其中12个字段参与计算,计作:a1到a12
B实体类共有16个字段,其中8个字段参与计算,计作:b1到b8
C实体类共有19个字段,其中10个字段参与计算,计作:c1到c10
所有30个字段都不为空才算完整
目前的判断语句为:
if (!StringUtils.isEmpty(a1) && ...
&& !StringUtils.isEmpty(c10)){
return true;
}
目前的代码很长,是否可以简单优化?为什要那样优化?
编写一个新函数?
解决方案2:把判断条件抽离,归类。
通过函数语义式的调用返回结果来判断,好修改,也好阅读。
比如if (validationA() && validationB())
@NotEmpty
解决方案4:可以用断言assert , Assert.noNullElements(new Object[]{1,"222"},"所有字段都不能为空"); 三个类 每个类中各加一个方法判断自己的字段,调用这三个方法,或者 写三次Assert.noNullElements(new Object[]{1,"222"},"所有字段都不能为空");分别传入各个类的字段。
解决方案5:通过反射,或者BeanMap即可以字符串形式用循环来遍历对象上的属性了
解决方案6:自己编写一些辅助方法即可,将所有判断的字符串放到一个数组或 List 中,判断全部非空即可。
static boolean isEmpty(String s) {
return (s == null) || s.isEmpty();
}
static boolean isEmptyAll(String[] arr) {
boolean res = (arr != null) && (arr.length > 0);
if (res) {
for (String s : arr) {
res &= isEmpty(s);
}
}
return res;
}
static boolean isEmptyAll(Collection list) {
boolean res = (list != null) && !list.isEmpty();
if (res) {
for (String s : list) {
res &= isEmpty(s);
}
}
return res;
}
static boolean isNonEmpty(String s) {
return (s != null) && !s.isEmpty();
}
static boolean isNonEmptyAll(String[] arr) {
boolean res = (arr != null) && (arr.length > 0);
if (res) {
for (String s : arr) {
res &= isNonEmpty(s);
}
}
return res;
}
static boolean isNonEmptyAll(Collection list) {
boolean res = (list != null) && !list.isEmpty();
if (res) {
for (String s : list) {
res &= isNonEmpty(s);
}
}
return res;
}
解决方案7:if(m_state==1)
{
switch(m_tSpeed)
{
case 1:
....
}
}
else if(m_state==2)
{
同上
}
大概意思就是这样,可以把一个判断提出来先做,然后再做另一个判断!
解决方案8:维护一个需要验证的字段名数组,for...in循环遍历对象属性+一个flag=true,如果是需要遍历的则isEmpty验证,如果不是continue。出现空了flag=false就break(如果三个实体需要校验的字段名没有重复,把三个对象union一份出来单独做校验)
解决方案9:[StringUtils].every(function(StringUtil, index){
return !StringUtil.isEmpty(a1)
})
原生的数组方法 只有全真才输出true
解决方案10:可以尝试一下正则表达式
解决方案11:String[] strings = {"a1",null,"a3","c1","c3","d1", "d2","d3"};
boolean flag = Arrays.stream(strings).anyMatch(StringUtils::isEmpty);
熟悉流处理 很多代码都可以简化
解决方案12:看题主的问题,虽然直接每个对象每个字段都去get判空是可以,但是这样的代码明显不方便维护,而且可能越加越多,因此我分析主要需要解决以下两个问题
针对这两个问题,我认为
这就有了一下的代码:
首先是标注的注解EmptyCheck
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EmptyCheck {
}
然后注解到一个实体类A中的字段里,其中a1,a3
字段需要判空,a2
字段不需要
@Getter
@Setter
public class A {
@EmptyCheck
private String a1;
private String a2;
@EmptyCheck
private String a3;
}
以上是准备工作,接下来就是写如何校验了,我采用了一个校验类EmptyCheckUtils
,把所有校验方法放到里面了
既然是对于A,B之类的实体类对象进行校验,那第一个提供的方法,就是针对所有的实体类对象进行的校验isAllNotEmpty
,判断所有对象的所有有EmptyCheck标注的字段值是否都不为空