在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
}