如何避免编写"XXX!=null"或"XXX!=null || XXX.isEmpty"等代码



我正在编写查询数据库以获取数据的代码。有一些类是由List s组成的,但有时列表或其他属性不能启动,它们的值是null,所以我需要写list!=null || list.isEmptyattribute != null,才能使用属性。

不幸的是,很容易忘记它,而且我真的认为每次操作属性时都这样做是很难看的。我将写一些代码来解释它。
public class SpotVo {
    private Double avg;
    private String brief;
    private ArrayList<HotelVo> hotels;
    private int id;
    private ArrayList<byte[]> images;
    private AddressVo location;
    private String name;
    private ArrayList<RestaurantVo> restaurants;
}

正如你所看到的,在这个类中有一些列表和其他属性,都可以是null或空的,我能做些什么来避免它吗?

答案取决于null是否具有特殊含义。例如,对于String字段,您的应用程序需要区分null""吗?对于Collection值字段,它需要区分null和空集合对象吗?

如果答案是"否",那么你可以编写你的"数据对象"类来将空归一化为各自的"带内"值。您可以在getter、setter或构造函数中执行此操作,具体取决于对象是如何从数据库中具体化的。

你可以做的其他一些事情是:

  • 修改数据库模式,使相应的列"not null"

  • 如果你正在使用ORM或数据绑定机制,尝试配置(通过注释或其他)使用"in band"值而不是null

null转换为""或空数组或集合的要点是,您不需要将"in带"值视为特殊情况…除非您的应用程序的业务逻辑特别要求这样做。

简而言之,如果您系统地排除了null值,则不需要在业务逻辑中测试它们。


注意,这种方法并不总是有效。让我恼火的是在servlet中从HTTPRequest对象获取参数:

  • 应用程序可能必须处理4种不同的情况:

    • 参数不存在

    • 参数不存在/为空值

    • 参数存在非空值

    • 参数多次出现

  • 这些参数是从一个标准的API中获取的,而不是一个可以根据web应用程序的需求进行规范化的自定义类。

解决这个问题最简单的方法是使用CollectionUtils.isEmpty。

如果为空或为null则返回true

这样你可以在一行中完成。

当涉及到"属性"时,有一些设计模式可以提供帮助。或者,您可以使用Guava的Optional类。Guava's可选类

您可以编写一个函数来检查一个对象是否为null和/或如果它是一个String,它是否是""。然后只需在每次需要检查所有条件时调用该函数。让它返回一个布尔值,这样你就可以把它插入到if语句中。

boolean check(Object o)
{
    if (o != null)
        {
            if (o instanceof String)
            {
                if (((String) o).equals(""))
                    return false;
            }
            return true;
        }
        return false;
}

参考rcook在评论中的建议,以获得更好的实现

我认为这里有两个问题:一个是你必须检查null值,我绝对同意这是愚蠢的。问题是null是Java语言的本机,所以使它稍微好一点的唯一方法是使用Steve P和tieTYT提到的方法。然而,还有另一种处理null的方法,即不使用它。当然,您不能完全避免它,但至少在您自己的代码中,您应该消除所有null引用。这里有一些很好的参数,我不会在这里讨论,但您可以阅读避免!= null语句了解更多细节。

如果您对基于java的语言Scala感兴趣,可以通过实现Option类来很好地实现这一点,该类可以判断一个值是否存在(等于null值)。不错的博客文章在这里:http://jim-mcbeath.blogspot.fr/2008/10/avoiding-nulls.html

(大部分)将null问题存储起来后,下一个问题将是在使用集合时检查isEmpty或类似的问题。就像你说的,这让人头疼。但我发现这些检查基本上是可以避免的。当然,这完全取决于您需要对集合做什么,但在大多数情况下,集合以某种方式用于遍历或操作。在Java中使用foreach-loop将确保如果集合中没有任何内容,则不执行任何操作。整洁。

在某些情况下,集合不能为空。其中一些可以通过良好的设计来避免(例如,允许空列表,确保没有列表为空等),但是,对于其余的,根本没有办法。永远。但是,已经消除了空检查,调用一些isEmpty现在和然后不是那么糟糕:-)

希望有帮助。

最新更新