一尘不染

断言一个好习惯吗?

java

将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);
      }
   }
}

阅读 189

收藏
2020-12-03

共1个答案

一尘不染

原则上,断言与许多其他运行时检查没有什么不同。

例如,Java在运行时对所有数组访问进行绑定检查。这会使事情变慢吗?是。有好处吗?绝对!一旦发生越界违规,就会引发异常,并警告程序员任何可能的错误!在其他未对数组访问进行绑定检查的系统中,其行为是无法预料的!(通常会带来灾难性的后果!)。

无论使用图书馆还是语言支持,断言在本质上都是相似的。有性能成本,但这绝对值得。实际上,断言是更有价值的,因为它是显式的,并且可以传达更高层次的概念。

如果使用得当,可以最大程度地降低性能成本,并最大程度地提高客户端(因为谁会比以往更早地发现违反合同的合同)和开发人员(因为合同是 自我执行
自我记录 )的价值。

另一种看待它的方法是将断言视为“活动评论”。毫无疑问,评论是有用的,但它们是被动的。在计算上他们什么都不做。通过将某些概念表述为断言而不是注释,它们变为活动状态。他们实际上必须在运行时保持;违规行为将被发现。


另请参见:使用断言进行编程的好处

2020-12-03