Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java集合上使用get()时,如何避免大量的null检查?_Java_Data Structures - Fatal编程技术网

在Java集合上使用get()时,如何避免大量的null检查?

在Java集合上使用get()时,如何避免大量的null检查?,java,data-structures,Java,Data Structures,我有如下声明 getLD().get(cam.getName()).getAGS().get(aG.getName()) getLD(),getAGS()返回Java集合 < > >如果代码> GETAGSH()/代码>是空的,也不会认为是错误,如果 GETAGSH()的结果(AG.GETNAMEL())< /C>是空的。然而,检查这些空条件是相当麻烦的 e、 g.if(getLD().get(camp.getName()).getAGS()!=null和&getLD().get(cam.ge

我有如下声明

getLD().get(cam.getName()).getAGS().get(aG.getName())
getLD(),getAGS()返回Java集合

< > >如果代码> GETAGSH()/代码>是空的,也不会认为是错误,如果<代码> GETAGSH()的结果(AG.GETNAMEL())< /C>是空的。然而,检查这些空条件是相当麻烦的

e、 g.
if(getLD().get(camp.getName()).getAGS()!=null和&getLD().get(cam.getName()).getAGS().get(aG.getName())!=null){

有人能提出处理这个问题的最佳方法吗?显然,我可以创建一个变量
x=getLD().get(camp.getName()).getAGS()
,来缩短代码,但是有没有一种方法可以让我不必对null进行两次检查


非常感谢所有帮助!

apache commons项目有一个名为Bean内省实用程序(BeanUtils)的库,它看起来可以满足您的需要。请查看用户指南中的嵌套属性访问部分,并查看BeanUtils类:

try {
   foo().bar().baz();
} catch (NullPointerException e) {
    // Check if it was actually an error
}

它有一些实用程序类,我认为它们可以满足您的需要

另一件需要考虑的事情是:您应该尽量避免进行这么多级别的嵌套属性访问。这是一种称为“功能嫉妒”的代码味道在一个对象想要经常使用另一个对象的特征的情况下,考虑在顶层对象上创建方法,或者找到一种方法来重新设计,以便更容易地共享所需的特征。 根据您的环境和性能要求,这并不总是可能的。但只需键入即可

if (getLD(camp?.GetName())?.getAGS(ag?.GetName()))

或者,您可以只编写您的意思并捕获空指针异常。在您的情况下,这将更具可读性,尤其是您不关心哪个元素为空。

在我看来,最好的策略是设计数据结构,以便首先不存在任何空指针。例如,使用空集合或零长度h数组或“代码>”“<代码> >而不是<代码> null <代码>。对于应用程序类,考虑实现可以使用的特殊实例,而不是<代码> null < /> > < /p> 第二种策略是用自定义类替换公开的通用数据结构(如映射、列表、数组)。这隐藏了类内部的实现细节,并允许您使用Java的静态类型来避免许多需要空检查的情况

第三种策略是创建一个helper类,其中包含一系列实现常见操作的方法;例如,“获取LD的Cam”(在我看来,与其他方法相比,这种方法是一种较差的选择,但至少它减少了代码重复的数量。)


如果你不能消除空值,你别无选择,只能显式地测试它们。(有人提议在Java 7中添加一个“elvis”操作符作为project Coin的一部分,但不幸的是它被切断了。)

最好的方法是避免这个链。如果你不熟悉Demeter定律(LoD),在我看来你应该这样做。你给出了一个完美的消息链示例,该消息链与它不必知道的类过于亲密


得墨忒尔定律:

如果你需要做的话,我认为有些事情比需要的更复杂

getLD().get(cam.getName()).getAGS().get(aG.getName())
如果需要检查第二个集合或结果是否为null,可以执行以下操作:

Map<?,?> firstList= getLD();
Object value = null;
if (firstList!=null && !firstList.isEmpty() && fistList.containsKey(cam.getName())){
    Map<?,?> secondList = firstList.get(cam.getName());
    if (secondList!=null && !secondList.isEmpty() && secondList.containsKey(aG.getName())){
        value = secondList.get(aG.getName());
    }
}

if(value != null){
  // Do the required operations if the value is not null
}else{
  // Do the required operations if the value is null
}

如果我必须写一个java().c.(),不,这会默默地丢弃FoE()、Bar()或BAZ-()的任何NPE。我会考虑这个坏代码。如果这些方法中的一个方法在内部抛出了一个Null PoExtExeExchange,会发生什么?(就像JAXB生成的DTO),这种风险对我来说似乎不存在。我基本上同意,但如果像JAXB一样,他们会为您生成结构,不幸的是没有考虑到这一点。因此,如果我有一个HashMap,其中的元素带有键“1”和“2”,但我会尝试获取键“3”的值如何让它返回非空值?@Zwei-这在我的第二段中介绍过。如果
null
值不能被设计出来,您需要显式地测试它们……或者使用另一种语言。@QuackerOat-如果您想避免空值检查,就不应该使用哈希映射作为您的主要数据结构。编写并改用自定义类。
private Map<?,?> getItem(Map<?,?> map,Object key){
    if (map!=null && !map.isEmpty() && map.containsKey(key)){
        return map.get(key);
    }
    return null;
}
Object value = getItem(getItem(getLD(),cam.getName()),aG.getName());

if(value != null){
    // Do the required operations if the value is not null
}else{
     // Do the required operations if the value is null
}