15

我正在编写查询数据库以获取数据的代码。有一些类是由Lists 组成的,但有时无法启动列表或其他属性,它们的值为null,所以我需要写list!=null || list.isEmptyor attribute != 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或为空,我可以做些什么来避免它吗?

4

4 回答 4

5

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

如果答案是“否”,那么您可以编写“数据对象”类以将空值标准化为相应的“带内”值。您可以在 getter 或 setter 或构造函数中执行此操作,具体取决于对象是如何从数据库中具体化的。

您可以做的其他几件事是:

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

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

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

简而言之,如果您null系统地剔除这些值,则无需在业务逻辑中对其进行测试。


请注意,这种方法并不总是有效。让我烦恼的情况是从HTTPRequestservlet 中的对象获取参数:

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

    • 参数不存在

    • 参数没有值/空值

    • 参数存在非空值

    • 参数出现多次。

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

于 2013-05-25T02:49:56.627 回答
1

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

返回:如果为空或 null,则返回 true

这样,您可以在一行中完成。

当谈到“属性”时,有一些设计模式可以帮助解决这个问题。或者,您可以使用Guava 的 Optional类。您可以在此处阅读更多相关信息:Guava 的 Optional 类有什么意义

于 2013-05-25T02:13:54.807 回答
0

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

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

(大部分)已经把空问题藏起来了,下一个问题将是isEmpty在使用集合时检查或类似的问题。正如你所说,这是一种痛苦。但我实际上发现这些检查可以在很大程度上避免。当然,这完全取决于您需要对集合做什么,但在大多数情况下,集合用于以某种方式遍历或操作。在 Java 中使用 foreach 循环将确保如果集合中没有任何内容,则不会执行任何操作。整洁的。

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

希望有帮助。

于 2013-05-25T02:42:26.350 回答
0

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

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

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

于 2013-05-25T02:11:39.023 回答