知道Class中的所有变量是否为空的最佳方法是什么?

时间:2012-09-11 03:10:06

标签: java

这意味着该类已初始化,但未设置变量。

示例类:

public class User {

    String id = null;
    String name = null;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

实际的类很大,我不想检查每个变量是否(xyz == null)。

9 个答案:

答案 0 :(得分:36)

另一个针对Java 8的非反射解决方案,在paxdiabo's answer行中,但没有使用一系列if,将流式传输所有字段并检查是否为空:< / p>

return Stream.of(id, name)
        .allMatch(Objects::isNull);

这仍然很容易维护,同时避免反射

答案 1 :(得分:27)

尝试这样的事情:

public boolean checkNull() throws IllegalAccessException {
    for (Field f : getClass().getDeclaredFields())
        if (f.get(this) != null)
            return false;
    return true;            
}

虽然如果可行的话,检查每个变量可能会更好。

答案 2 :(得分:5)

“最佳”是这样一个主观术语: - )

我只想使用检查每个变量的方法。如果你的课程中已经有很多这些,那么如果你做了类似的事情,那么增加的大小就不会那么多了:

public Boolean anyUnset() {
    if (  id == null) return true;
    if (name == null) return true;
    return false;
}

如果您按照相同的顺序保存所有内容,则代码更改(如果您是偏执狂,则使用脚本自动检查)将相对轻松。

或者(假设它们都是字符串),您基本上可以将这些值放入某种类型的映射中(例如,HashMap),并保留该列表的键名列表。这样,您可以遍历键列表,检查值是否设置正确。

答案 3 :(得分:4)

也可以在不使用反射的情况下完成。

解决方案是动态的。当您的类使用新字段进行扩展时,您无需将它们添加到列表中或添加另一个空检查。

注意:

我使用了Lombok的EqualsAndHashCode注释。

您必须确保默认构造函数不是使用自定义行为实现的,并且您的字段没有内置java默认值以外的默认值(引用类型为null,int为0等)。

@EqualsAndHashCode
public class User
{
    private static User EMPTY = new User();

    private String id = null;
    private String name = null;

    private User()
    {
    }

    public User(String id, String name)
    {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public boolean isEmpty()
    {
        return this.equals(EMPTY);
    }
}

答案 4 :(得分:3)

溪流怎么样?

public boolean checkFieldsIsNull(Object instance, List<String> fieldNames) {

    return fieldNames.stream().allMatch(field -> {
        try {
            return Objects.isNull(instance.getClass().getDeclaredField(field).get(instance));
        } catch (IllegalAccessException | NoSuchFieldException e) {
            return true;//You can throw RuntimeException if need.
        }
    });
}

答案 5 :(得分:2)

在我看来,最好的方式是反思,正如其他人所推荐的那样。这是一个评估每个本地字段为null的示例。如果找到一个非null,则method将返回false。

public class User {

    String id = null;
    String name = null;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isNull() {
        Field fields[] = this.getClass().getDeclaredFields();
        for (Field f : fields) {
            try {
                Object value = f.get(this);
                if (value != null) {
                    return false;
                }
            }
            catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
        return true;

    }

    public static void main(String args[]) {
        System.out.println(new User().isNull());
    }
}

答案 6 :(得分:2)

如果您想将此用于单元测试,我只使用hasNoNullFieldsOrProperties()中的assertj方法

assertThat(myObj).hasNoNullFieldsOrProperties();

答案 7 :(得分:1)

Field[] field = model.getClass().getDeclaredFields();     

for(int j=0 ; j<field.length ; j++){    
            String name = field[j].getName();                
            name = name.substring(0,1).toUpperCase()+name.substring(1); 
            String type = field[j].getGenericType().toString();    
            if(type.equals("class java.lang.String")){   
                Method m = model.getClass().getMethod("get"+name);
                String value = (String) m.invoke(model);    
                if(value == null){
                   ... something to do...
                }
}

答案 8 :(得分:1)

我认为这是一个可以轻松解决您的问题的解决方案:(如果任何参数都不为null,则返回true)

  public boolean isUserEmpty(){ 
boolean isEmpty;
isEmpty =  isEmpty = Stream.of(id,
            name)
        .anyMatch(userParameter -> userParameter != null);

return isEmpty;}

同一任务的另一个解决方案是:(您可以将其更改为if(isEmpty == 0)检查所有参数是否为空。

public boolean isUserEmpty(){  
       long isEmpty;
            isEmpty = Stream.of(id,
                    name)
                    .filter(userParameter -> userParameter != null).count();

            if (isEmpty > 0) {
                return true;
            } else {
                return false;
            }
    }