如何检测是否只设置了部分属性?

时间:2014-10-29 15:18:17

标签: java combinatorics

String a = "1";
String b;
...
String n = "100";

如何检查是否已设置所有属性?

我想得到"有效"如果a..n设置了所有属性,并且"有效"如果没有设置则没有。但是"无效"如果只是部分设置。

如何解决这个问题?当然,我可以编写无穷无尽的布尔语句,如

(a != null && b != null & .. & n != null) || (a == null && b == null & .. & n == null)

但必须有更好的方法。

2 个答案:

答案 0 :(得分:1)

有一个样本类

public class SampleClass {    

    private String a, b, c, d, e, f;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = c;
    }

    public String getD() {
        return d;
    }

    public void setD(String d) {
        this.d = d;
    }

    public String getE() {
        return e;
    }

    public void setE(String e) {
        this.e = e;
    }

    public String getF() {
        return f;
    }

    public void setF(String f) {
        this.f = f;
    }

}

您可以使用java.beans.Introspector

获取Java Bean信息
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;

import org.junit.Test;

public class IntrospectorTest {

    @Test
    public void test() throws IntrospectionException, IllegalArgumentException,
            IllegalAccessException, InvocationTargetException {

        SampleClass sampleClass = new SampleClass();

        sampleClass.setA("value for a");
        sampleClass.setB("value for b");
        sampleClass.setC("value for c");
        sampleClass.setD("value for d");
        sampleClass.setE("value for e");
        sampleClass.setF("value for f");

        int withValue = 0;

        PropertyDescriptor[] descriptors = Introspector.getBeanInfo(SampleClass.class, Object.class).getPropertyDescriptors();

        for (PropertyDescriptor propertyDescriptor : descriptors) {
            Object value = new PropertyDescriptor(propertyDescriptor.getName(), SampleClass.class).getReadMethod().invoke(sampleClass);
            if (value!=null) {
                withValue++;
                System.out.println(propertyDescriptor.getName() + ": " + value);    
            }
        }

        if (descriptors.length == withValue || withValue == 0) {
            System.out.println("valid");
        }else{
            System.err.println("Invalid!!");
        }
    }
}

瞧!

在此行注意

Introspector.getBeanInfo(SampleClass.class, Object.class).getPropertyDescriptors();

如果您将getBeanInfo方法作为一个参数调用,而Introspector将返回类层次结构中的所有属性描述符,那么您可以使用可选的停止类调用该方法Introspector停止阅读属性描述符。

希望这有帮助。

答案 1 :(得分:0)

您可以使用map然后迭代它来检查是否有任何值为null并相应地设置状态。

你也可以试试这个:Collections.frequency(map.values(),null)== map.size()