如何避免编写“XXX!=null”或“XXX!=null”之类的代码||XXX.是空的”

2022-09-03 07:57:37

我正在编写查询数据库以获取数据的代码。有一些类由s组成,但有时列表或其他属性无法启动,它们的值为,所以我需要编写或,然后才能使用该属性。Listnulllist!=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


答案 1

答案取决于是否具有特殊含义。例如,对于某个字段,您的应用程序是否需要区分 和 ?对于 -值字段,是否需要区分 和空集合对象?nullStringnull""Collectionnull

如果答案为“否”,则可以编写“数据对象”类,将 null 规范化为相应的“带内”值。您可以在 getters、setter 或构造函数中执行此操作,具体取决于对象从数据库中具体化的方式。

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

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

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

转换为或空数组或集合的要点是,您不需要将“带内”值视为特例......除非应用程序的业务逻辑明确要求这样做。null""

简而言之,如果系统地标记这些值,则无需在业务逻辑中测试它们。null


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

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

    • 参数不存在

    • 参数不存在,没有值/空值

    • 参数以非空值显示

    • 参数存在多次。

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


答案 2

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

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

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

当涉及到“属性”时,有一些设计模式可以帮助解决这个问题。或者,您可以使用番石榴的可选类。你可以在这里阅读更多关于它的信息:番石榴的可选课程有什么意义


推荐