【问题标题】:How to handle null values in Java (eclipse IDE)如何在 Java 中处理空值(eclipse IDE)
【发布时间】:2015-09-02 04:03:00
【问题描述】:

我正在开发一个 API(Eclipse IDE - Kepler),JDK 1.7) 我需要一个捷径,比如 @IfNotNullUpdate

考虑以下内容,例如

Model model = new Model();
String field1 = entity.getField1() != null ? entity.getField1() : "";
model.setField1(field1);

这样我就可以简单地写成这样了

model.setField1( @IfNotNullUpdate entity.getField1(),"");

我不想有任何 NullPointerExceptions。如果它可以像构建器模式一样工作,那将是一个很大的帮助。例如

model.addField_25(@IfNotNullUpdate entity.getField_37())
     .addField_16(@IfNotNullUpdate entity.getField_69());

我尝试了lombok 的@NonNull。它只是确保参数不为空,这不是我的要求。

当然 assert() 不能成为解决方案。希望我能很好地解释我的要求。

提前致谢。

【问题讨论】:

标签: java eclipse nullpointerexception lombok


【解决方案1】:

看看Optional。使用提供的示例,如果调用的任何方法返回空值,则以下内容可能会引发 NPE:

String version = computer.getSoundcard().getUSB().getVersion();

为避免这种或过多的if (x != null) 检查,使用Optional,您可以使用:

String name = computer.flatMap(Computer::getSoundcard)
                          .flatMap(Soundcard::getUSB)
                          .map(USB::getVersion)
                          .orElse("UNKNOWN");

【讨论】:

  • 我认为这些检查似乎比这更简单,更易读。
  • @Zar 当你有 10 多个嵌套的 if 空检查时不会。
  • @M.Shaw 我同意这是最好的选择。我有更多时间引入 JDK 8(向后兼容性)。我很想用这个。感谢您的解决方案。
  • @DVSanthoshKiran 如果它解决了您的问题,请将其标记为答案。
  • @M.Shaw 我还在探索 Java 7 的选项
【解决方案2】:

您需要为此或您的任何目的构建自定义注释。您可以使用@Target(ElementType.PARAMETER) 为您创建一个注释,并根据需要使用反射来映射它。但这是一个漫长的过程,不需要你太多时间。相反,只需编写一个方法并调用它。

我想不出一个现成的 API。正如您所指出的,lombok 不会为您这样做。

【讨论】:

  • 是的,自定义注释不值得花时间。我实际上正在寻找现有的解决方案。
【解决方案3】:

你为什么不只使用一种方法?如果需要,您可以将其设为静态,以便您可以通过 className 访问它。或者将您需要的辅助方法放在一个类中并扩展它。

public String getFieldValue(Object o ){
    if(o instanceof someEntity){
        someEntity se = (someEntity) o
        if(someEntity.getField() != null){
            return someEntity.getField();
        }else{
            return ""; 
        }
    }else if(o instanceof someOtherEntity){
       ...
    }
}

【讨论】:

  • 如果我有数千个实体和模型,每个都有数百个字段,这实际上可行吗?
  • 猜猜你有没有很多。然后你可以使用反射:
  • Public String getField(Object bean, String methodName){ BeanInfo info = Introspector.getBeanInfo(bean.getClass(), Object.class); PropertyDescriptor[] props = info.getPropertyDescriptors(); String value; for (PropertyDescriptor pd : props) { Method getter = pd.getReadMethod(); if(getter.getName().equals(methodName)){ //add try catch //get the value from method value = getter.invoke(bean); if(value != null)return value; } } return ""; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2015-10-27
  • 2020-02-20
  • 2011-12-24
  • 2015-04-06
  • 2017-09-10
  • 2011-10-09
相关资源
最近更新 更多