NULL参数是不好的做法吗?

Mad*_*hik 19 java methods null arguments exception

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

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

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

    List<Company> getAllCompaniesList();
    List<Company> getCompaniesList(Company companyFilter);
Run Code Online (Sandbox Code Playgroud)

或者我们可以有一种方法

    List<Company> getCompaniesList(Company companyFilter);
Run Code Online (Sandbox Code Playgroud)

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

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

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

在某些情况下,我们不能像方法那样拥有null参数

    void addBranches(int companyId, List<Branch>);
Run Code Online (Sandbox Code Playgroud)

通过定义如下方法,使用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");
                 } 
           }   
}
Run Code Online (Sandbox Code Playgroud)

但我面临的问题是因为我已经定义了一些方法,这些方法应该接受一个方法的多个功能的NULL参数,如上面提到的方法List getCompaniesList(Company companyFilter); 所以我不能对所有方法统一应用AOP,并且方法名称匹配的某些表达式在这里都不会有用.

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

感谢您阅读我的问题并思考它.

Boz*_*zho 18

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

@param foo foo description. Can be null
Run Code Online (Sandbox Code Playgroud)

在你的情况下,我有两种方法,第一种方法用null参数调用第二种方法.它使API更有用.

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


另请注意,处理多个构造函数参数的首选方法是通过Builder.所以代替:

public Foo(String bar, String baz, int fooo, double barr, String asd);
Run Code Online (Sandbox Code Playgroud)

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

Foo foo = new FooBuilder().setBar(bar).setFooo(fooo).build();
Run Code Online (Sandbox Code Playgroud)


hen*_*g77 16

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

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

我使用OptionalPreconditions或AOP来强制执行该规则.在NPE或奇怪的行为之后,这个决定已经为我节省了大量的时间.


Tim*_*ass 6

这是常见的做法,但有一些方法可以使您的代码更清晰 - 有时避免空值检查,或者将它们移动到别处.查找空对象模式 - 它可能正是您所需要的:http://en.m.wikipedia.org/wiki/Null_Object_pattern?wasRedirected = true