java - 是否可以在 Java 中检查对象字段是否为空,然后为所有这些属性添加默认值?

标签 java null

我需要确保没有对象属性为空,如果为空,则添加默认值。有什么简单的方法可以做到这一点,还是我必须通过 getter 和 setter 检查每个属性来手动完成?

最佳答案

您可以使用反射来迭代对象的字段,并设置它们。您显然需要在类型甚至字段名称与所需默认值之间进行某种映射,但这可以在循环中很容易地完成。例如:

for (Field f : obj.getClass().getFields()) {
  f.setAccessible(true);
  if (f.get(obj) == null) {
     f.set(obj, getDefaultValueForType(f.getType()));
  }
}

[更新]

在现代 Java 中,您可以使用注解为每个类设置字段的默认值。一个完整的实现可能如下所示:

// DefaultString.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface DefaultString {
    String value();
}

// DefaultInteger.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface DefaultInteger {
    int value();
}

// DefaultPojo.java:
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class DefaultPojo {

    public void setDefaults() {
        for (Field f : getClass().getFields()) {
            f.setAccessible(true);
            try {
                if (f.get(this) == null) {
                    f.set(this, getDefaultValueFromAnnotation(f.getAnnotations()));
                }
            } catch (IllegalAccessException e) { // shouldn't happen because I used setAccessible
            }
        }
    }

    private Object getDefaultValueFromAnnotation(Annotation[] annotations) {
        for (Annotation a : annotations) {
            if (a instanceof DefaultString)
                return ((DefaultString)a).value();
            if (a instanceof DefaultInteger)
                return ((DefaultInteger)a).value();
        }
        return null;
    }

}

// Test Pojo
public class TestPojo extends DefaultPojo {
    @DefaultString("Hello world!")
    public String stringValue;
    @DefaultInteger(42);
    public int integerValue;
}

然后可以通过运行 test.setDetaults()

来设置 TestPojo 的默认值

关于java - 是否可以在 Java 中检查对象字段是否为空,然后为所有这些属性添加默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2146129/

相关文章:

c# - java 的 -verbose :gc command line option 的 .NET 等价物是什么

java - 具有两列的 TreeView JavaFX 8

java - 我应该在 Swing GUI 中重写 frameInit 来初始化代码吗?

java - 为 fragment 中的 TextView 设置语言环境

javascript - 为什么reference = null 不会影响被引用的对象?

reactjs - 当我在 React 中按下 f5 刷新时,Ckeditor 为 null(消失)

java.lang.ClassCastException : Cannot cast org. glassfish.web.loader.WebappClassLoader 到 org.osgi.framework.BundleReference

C# JSON 从 JavaScript 发布

c# - 检查 'null'

c# - 为什么事件会为空? (你调用的对象是空的)