对函数参数使用 Assert 来强制它们的有效性是一种好习惯吗?我正在浏览 Spring Framework 的源代码,我注意到他们经常使用 Assert.notNull
。这是一个例子
public static ParsedSql parseSqlStatement(String sql) {
Assert.notNull(sql, "SQL must not be null");
}
这是另一个:
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;
}
仅供引用,Assert.notNull
(不是 assert
语句)在 util 类中定义如下:
public abstract class Assert {
public static void notNull(Object object, String message) {
if (object == null) {
throw new IllegalArgumentException (message);
}
}
}
最佳答案
原则上,assertions与许多其他运行时检查没有什么不同。
例如,Java 在运行时对所有数组访问进行边界检查。这会让事情变慢吗?是的。有好处吗?绝对地!一旦发生越界违规,就会引发异常,并提醒程序员注意任何可能的错误!在其他系统中,数组访问未进行边界检查的行为更加不可预测! (通常会带来灾难性的后果!)。
断言,无论您使用库还是语言支持,在本质上都是相似的。有性能成本,但绝对值得。事实上,断言更有值(value),因为它是显式的,并且可以传达更高层次的概念。
如果使用得当,可以最大限度地降低性能成本和值(value),对于客户(他们迟早会发现违反契约(Contract)的行为)和开发人员(因为契约(Contract)是 self 执行和self-documenting),被最大化。
另一种看待它的方式是将断言视为“活跃的评论”。毫无疑问,评论很有用,但它们是被动的;在计算上他们什么都不做。通过将一些概念表述为断言而不是评论,它们变得活跃。它们实际上必须在运行时保持;违规将被抓获。
关于java - 断言一个好的做法与否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440984/