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作为参数或公共方法的返回值.
我使用Optional和Preconditions或AOP来强制执行该规则.在NPE或奇怪的行为之后,这个决定已经为我节省了大量的时间.
这是常见的做法,但有一些方法可以使您的代码更清晰 - 有时避免空值检查,或者将它们移动到别处.查找空对象模式 - 它可能正是您所需要的:http://en.m.wikipedia.org/wiki/Null_Object_pattern?wasRedirected = true