将Assert用于函数参数以强制执行其有效性是一种好习惯.我正在浏览Spring Framework的源代码,我注意到它们使用Assert.notNull
了很多.这是一个例子
public static ParsedSql parseSqlStatement(String sql) {
Assert.notNull(sql, "SQL must not be null");}
Run Code Online (Sandbox Code Playgroud)
这是另一个:
public NamedParameterJdbcTemplate(DataSource dataSource) {
Assert.notNull(dataSource,
"The [dataSource] argument cannot be null.");
this .classicJdbcTemplate = new JdbcTemplate(dataSource);
}
public NamedParameterJdbcTemplate(JdbcOperations classicJdbcTemplate) {
Assert.notNull(classicJdbcTemplate,
"JdbcTemplate must not be null");
this .classicJdbcTemplate = classicJdbcTemplate;
}
Run Code Online (Sandbox Code Playgroud)
FYI,Assert.notNull
(不是assert
语句)在util类中定义如下:
public abstract class Assert {
public static void notNull(Object object, String message) {
if (object == null) {
throw new IllegalArgumentException (message);
}
}
}
Run Code Online (Sandbox Code Playgroud)
pol*_*nts 58
原则上,断言与许多其他运行时检查没有什么不同.
例如,Java绑定 - 在运行时检查所有数组访问.这会让事情变慢吗?是.这有益吗?绝对!一旦发生越界违规,就会抛出异常并且程序员会收到任何可能的错误警报!未对数组访问进行绑定检查的其他系统中的行为更加难以置信!(通常带来灾难性的后果!).
无论您使用图书馆还是语言支持,断言在精神上都是相似的.有性能成本,但绝对值得.事实上,断言更有价值,因为它是明确的,并且它传达了更高层次的概念.
如果使用得当,可以最大限度地降低性能成本,并且最大限度地提高客户(将尽快捕获合同违规)和开发人员(因为合同是自我执行和自我记录)的价值.
另一种看待它的方法是将断言视为"主动评论".没有人认为评论是有用的,但它们是被动的; 在计算上他们什么都不做.通过将一些概念描述为断言而不是注释,它们变为活动.他们实际上必须在运行时保持; 违规行为将被抓获.
另请参见:使用断言进行编程的好处
Mic*_*ers 28
这些断言是库提供的,与内置assert
关键字不同.
这里有一个区别:assert
默认情况下不运行(必须使用-ea
参数启用它们),而Assert
不能禁用类提供的断言.
在我看来(对于它的价值而言),这与验证参数的方法一样好.如果您使用内置断言作为问题标题暗示,我会反对它,因为必须检查不应该是可移除的.但这种方式只是简写:
public static ParsedSql parseSqlStatement(String sql) {
if (sql == null)
throw new IllegalArgumentException("SQL must not be null");
...
}
Run Code Online (Sandbox Code Playgroud)
......这在公共方法中总是很好的做法.
内置的断言样式对于条件应始终为true的情况或私有方法更有用.引入断言的语言指南有一些很好的指导方针,基本上就是我刚才所描述的.
Ste*_*n C 18
是的,这是好习惯.
在Spring的情况下,它特别重要,因为检查是验证通常来自XML连接文件的属性设置等.换句话说,他们正在验证webapp的配置.如果你做过任何严肃的基于Spring的开发,当你犯一个愚蠢的配置错误时,那些验证检查将为你节省数小时的调试时间.
但请注意,调用的库类Assert
与assert
用于定义Java断言的Java 关键字之间存在巨大差异.后一种形式的断言可以在应用程序启动时关闭,不应该用于您总是希望发生的参数验证检查.显然,Spring设计师认为关闭webapp配置健全性检查是一个非常糟糕的主意......我同意.
UPDATE
在Java 7(及更高版本)中,java.util.Objects
该类提供了一种requireNonNull
方便的方法来测试参数是否存在null
并引发异常.你这样使用它:
SomeType t = ...
SomeType tChecked = Objects.requireNonNull(t);
Run Code Online (Sandbox Code Playgroud)
要么
SomeType tChecked = Objects.requireNonNull(t, "t should be non-null");
Run Code Online (Sandbox Code Playgroud)
但请注意,这种方法NullPointerException
不是提高而是提高IllegalArgumentException
.
归档时间: |
|
查看次数: |
39939 次 |
最近记录: |