当你在一个DAO对象中写一个方法时,你不希望这个方法接受某些输入,为了讨论起见,说它不允许空参数。你如何实现这一点,考虑到这种方法将来可能会被新团队成员重用。
我这样做的方式是:
但是,如果未来的一些开发人员只是读取方法签名并决定它需要什么并开始使用它,而不关注这个细节,更糟糕的测试并没有揭示它。不会发生NULL指针异常,我们收到一条有用的错误消息,但是我们仍然会在生产中遇到一个可以避免的错误。
有没有办法在编译时强制执行此操作?我对此表示怀疑,但这样做最安全,最不开发的方法是什么?
答案 0 :(得分:4)
我认为你不能强制执行这个编译时间,但你肯定可以使方法签名易于理解。
如果您没有在其中一个验证框架上添加依赖项,则可以使用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) {
...
}
请查看Getting started with JSR 303 Bean Validation以获取更全面的示例。
答案 1 :(得分:1)
你可以使用jsr305和findbugs之类的静态代码检查工具在提交/发布之前检查它。
public String method(@NonNull String parameter ){
...
}
答案 2 :(得分:0)
尽可能接近在编译时强制执行的操作是抛出已检查的异常,这会强制调用者在编译时处理异常。这可能会让他们阅读文档。 IllegalArgumentException未经检查,可以不被注意。
保护不可用值的正常做法是在我们识别出不可用的东西时返回并添加错误消息以供显示。这样可以防止在该方法中继续执行时可能发生的生产异常,但可能无法完全避免。