在Java中处理未接受的方法参数最好的是什么?

当你在一个DAO对象中写一个方法,并且你不希望这个方法接受某些输入时,为了讨论起见,说它不允许空参数。 你如何实现这一点,考虑到这种方法将来可能会被新的团队成员重用。

我这样做的方式是:

  1. 在接口中,我在方法javadoc中记录了参数a,b和c不能为null。
  2. 在方法内部,我首先检查空值,如果a,b或c中的任何一个为null,则抛出IllegalArgumentException。

但是,如果未来的一些开发人员只是读取方法签名并决定它需要什么并开始使用它,而不关注这个细节,更糟糕的测试并没有揭示它。 不会发生NULL指针exception,我们收到一条有用的错误消息,但是我们仍然会在生产中遇到一个可以避免的错误。

有没有办法在编译时强制执行此操作? 我对此表示怀疑,但这样做最安全,最糟糕的开发人员方法是什么?

我不认为你可以强制执行这个编译时间,但你肯定可以使方法签名易于理解。

如果你没有在其中一个validation框架上添加依赖项,你可以使用JSR 303的@NotNull或类似Preconditions之类的工具。

使用JSR 303,您可以执行以下操作:

@NotNull @Size(min = 2, max = 14) @UpperCase private String licensePlate; 

要么

 @NotNull @NotEmpty public String foo(@NotNull @Pattern(regexp="[0-9]") String param) { ... } 

有关更全面的示例,请查看JSR 303 Beanvalidation入门 。

你可以使用jsr305和findbugs之类的静态代码检查工具在提交/发布之前检查它。

 public String method(@NonNull String parameter ){ ... } 

关于注释的findbugs手册

  1. 尽可能接近在编译时强制执行的操作是抛出已检查的exception,这会强制调用者在编译时处理exception。 这可能会使他们阅读文档。 IllegalArgumentException未选中,可以忽略不计。

  2. 保护不可用值的正常做法是在我们识别出不可用的东西时返回并添加错误消息以供显示。 这将防止在该方法中继续执行时可能发生的生产exception,但可能不会完全避免它。