NULL 参数是一种不好的做法吗?

2022-09-01 18:28:39

将 NULL 参数传递给方法是否是一种不好的做法,或者换句话说,我们是否应该有允许 NULL 参数作为有效参数的方法定义。

假设我想要两个方法1。以检索所有公司的列表 2.根据过滤器检索公司列表。

我们可以有两种方法,如下所示

    List<Company> getAllCompaniesList();
    List<Company> getCompaniesList(Company companyFilter);

或者我们可以有一个单一的方法

    List<Company> getCompaniesList(Company companyFilter);

在第二种情况下,如果参数为 NULL,则方法返回所有公司的列表。

除了良好实践的问题之外,实际上我看到了后面方法的另一个问题,下面将对此进行解释。

我正在实现Spring AOP,其中我想对像1这样的参数进行一些检查。参数是否为 NULL?2. 集合大小是否为 0?

在某些情况下,我们根本不能有空参数,比如方法

    void addBranches(int companyId, List<Branch>);

通过使用Spring AOP,通过定义如下方法,可以很好地执行此检查

@Before(argNames="args", value="execution(* *)")
void beforeCall(JoinPoint joinPoint ,Object[] args )
{ 
           foreach(Object obj in args)
           {
                 if(obj == NULL)
                 {
                     throw new Exception("Argument NULL");
                 } 
           }   
}

但是我面临的问题是,我已经定义了一些方法,这些方法应该接受一个方法的多个功能的NULL参数,如上所述,方法List getCompaniesList(Company companyFilter);因此,我无法对所有方法统一应用AOP,并且方法名称匹配的一些表达式在这里也没有用。

如果需要更多信息或问题描述性不够,请告诉我。

感谢您阅读我的问题并考虑它。


答案 1

我使用一个非常简单的规则:

永远不要允许 null 作为公共方法的参数或返回值。

我使用可选前提条件或AOP来执行该规则。这个决定已经为我节省了大量的时间,在NPE或奇怪的行为之后修复错误。


答案 2

在有太多的重载方法的情况下,这很好。因此,您不必拥有所有参数组合,而是允许其中一些参数是 。但是,如果您这样做,请明确记录null

@param foo foo description. Can be null

在你的例子中,我会有两个方法,其中第一个方法用参数调用第二个。它使 API 更易于使用。null

没有严格的行在哪里停止重载,哪里开始依赖可为空的参数。这是一个偏好问题。但请注意,因此,具有最多参数的方法将允许其中一些参数为空,因此也请记录这一点。


另请注意,处理多个构造函数参数的首选方法是通过生成器。因此,而不是:

public Foo(String bar, String baz, int fooo, double barr, String asd);

其中每个参数都是可选的,您可以拥有:

Foo foo = new FooBuilder().setBar(bar).setFooo(fooo).build();