关于java:如何避免编写代码,如“XXX!= null”或“XXX!= null ||

How to avoid write code like “XXX!=null” or “XXX!=null || XXX.isEmpty”

本问题已经有最佳答案,请猛点这里访问。

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

不幸的是,很容易忘记它,我真的认为每次操作一个属性时都这样做是很难看的。我要写一些代码来解释它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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或构造函数中这样做,具体取决于对象是如何从数据库具体化的。

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

  • 更改数据库架构以使相应的列"不为空"。

  • 如果您使用的是ORM或数据绑定机制,请尝试(通过注释或其他方式)将其配置为使用"带内"值而不是null

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

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

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

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

    • 参数不存在

    • 参数不存在值/空值

    • 参数具有非空值

    • 参数出现多次。

  • 这些参数是从标准API而不是自定义类中提取的,这些自定义类可以根据webapp的要求对值进行规范化。


我认为这里有两个问题:一个是你必须检查null值,我完全同意这是愚蠢的。问题是EDCOX1 0是一种原生的Java语言,所以使它稍微好一点的唯一方法是使用像Steve P和TieTyt所提到的方法。然而,还有另一种方法可以通过从不使用空值来处理它。当然,您不能完全避免它,但至少在您自己的代码中,您应该消除所有null引用。有一些很好的论据我不会在这里讨论,但你可以阅读回避!=空语句了解更多详细信息。

如果您感兴趣的是基于Java的语言,斯卡拉已经通过实现一个选项类来很好地开发这个选项类,该类可以判断一个值是否存在(等于EDCOX1的0值)。关于它的好博客帖子:http://jim-mcbeath.blogspot.fr/2008/10/avoising-nulls.html

在(大部分)将空问题存储起来之后,下一个问题将是在使用集合时检查isEmpty或类似的问题。就像你说的,这是屁股疼。但我发现这些支票在很大程度上是可以避免的。当然,这完全取决于您需要对集合做什么,但在大多数情况下,集合在某种程度上用于遍历或操作。使用Java中的Frach循环将确保在集合中什么都不执行时不执行任何操作。整洁的

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

希望有帮助。


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

Returns: true if empty or null

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

当涉及到"属性"时,有一些设计模式可以帮助实现这一点。或者,您可以使用guava的可选类。你可以在这里读到更多:瓜娃选修课有什么意义?


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

1
2
3
4
5
6
7
8
9
10
11
12
13
boolean check(Object o)
{
    if (o != null)
        {
            if (o instanceof String)
            {
                if (((String) o).equals(""))
                    return false;
            }
            return true;
        }
        return false;
}

请参阅评论中的RCOOK建议,以更好地实现这一点。