【问题标题】:How to avoid write code like "XXX!=null" or "XXX!=null || XXX.isEmpty" [duplicate]如何避免编写像“XXX!=null”或“XXX!=null || XXX.isEmpty”这样的代码 [重复]
【发布时间】:2013-05-20 16:37:40
【问题描述】:

我正在编写查询数据库以获取数据的代码。有一些类由Lists组成,但有时无法启动列表或其他属性,其值为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 检查,如果重要的内容为 null,则立即退出。我在学校有一位教授告诉我们“你编写的每个函数都应该少于 60 行”。这是我得到的一些最好的建议。
  • @jahroy "每个方法都应该少于 60 行"阿门,兄弟。
  • 我学到了另一个版本,它踢了一个写方法的人有 10 行超出你的术语。
  • @ssj ^^ 我希望我能从那个评论中理解......
  • @jahroy - 如果你不理解它,你可能会更快乐。

标签: java database-design


【解决方案1】:

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

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

请参阅 rcook 在 cmets 中的建议,以更好地实现这一点。

【讨论】:

  • 但是我不能为我在我的应用程序中使用的每个类编写一个函数。
  • 检查我的编辑。它适用于所有对象(您定义的所有类都隐式扩展对象)。如果您对特定对象有任何其他特殊情况,除了字符串,您可以将它们插入到函数中。
  • 不使用instanceof,而是为Object 提供一种方法,为String 提供一种方法。让编译器决定调用哪个并保存运行时 if 语句... boolean isEmpty(Object o) { return (o == null); }(集合需要额外的东西)
【解决方案2】:

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

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

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

当谈到“属性”时,有一些设计模式可以帮助解决这个问题。或者,您可以使用Guava's Optional 类。你可以在这里阅读更多信息:What's the point of Guava's Optional class

【讨论】:

    【解决方案3】:

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

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

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

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

    希望有所帮助。

    【讨论】:

      【解决方案4】:

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

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

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

      • 更改数据库架构以使各个列“不为空”。

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

      null 转换为"" 或空数组或集合的意义在于,您不需要将“带内”值视为特殊情况......除非您的应用程序的业务逻辑特别需要这个。

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


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

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

        • 参数不存在

        • 存在无值/空值的参数

        • 存在非空值的参数

        • 参数出现多次。

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

      【讨论】:

      • 我觉得你说得对,我应该从源头控制。
      • 我也这么认为,因为这种技术可以让你免于无缘无故地发送对象或空值,以防空值或字符串的“”
      猜你喜欢
      • 1970-01-01
      • 2012-11-20
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多