如何在Java中处理空值(eclipse IDE)

hzbexzde  于 2023-04-29  发布在  Eclipse
关注(0)|答案(4)|浏览(195)

我正在开发一个API(Eclipse IDE - Kepler),JDK 1。7)我需要一个快捷方式,如 @IfNotNullUpdate
考虑以下E。g的。

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

这样我就可以简单地把它写成

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

我不想有任何NullPointerException。这将是一个很大的帮助,如果它可以像建设者模式。用于例如

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

我试过lombok的@NonNull。它只是确保param不为null,这不是我的要求。
当然,assert()不是一个解决方案。希望我能很好地解释我的要求。
先谢谢你了。

eiee3dmh

eiee3dmh1#

看看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");
dffbzjpn

dffbzjpn2#

您将需要为此或您的任何目的构建一个自定义注解。您可以使用@Target(ElementType.PARAMETER)创建一个Annotation,并根据需要使用反射来Map它。但这是一个漫长的过程,不需要你太多的时间。相反,只需编写一个方法并调用它。
我想不出一个现成的API。就像你说的,Lombok岛不会为你做这些。

k10s72fa

k10s72fa3#

你为什么不用一种方法呢?如果需要,可以将其设置为静态的,这样就可以通过className访问它。或者把你需要的helper方法放在oneClass中并扩展它。

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){
       ...
    }
}
3df52oht

3df52oht4#

使用JDK 17更新答案:
我有一个helper方法,比如

public class NpeHelper {
 public static <T> Optional<T> ofNullable(final Supplier<T> resolver) {
        try {
            final T result = resolver.get();
            return Optional.ofNullable(result);
        } catch (NullPointerException e) {
            return Optional.empty();
        }
    }
}

我可以使用这个辅助函数作为

model.addField_25(NpeHelper.ofNullable(()-> entity.getField_37()).orElse(<AnyObject<));

对于Nullable流验证,我使用ApacheCommons的CollectionUtils。void run();

相关问题