java - 断言一个好的做法与否?

标签 java assert

对函数参数使用 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),被最大化。

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


另请参阅:the benefits of programming with assertions

关于java - 断言一个好的做法与否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440984/

相关文章:

java - 在 Apache Camel 中访问拆分 entrySet 的主体

matlab - Matlab 中矩阵断言的信息反馈

java.text.ParseException : Unparseable date: "20:01:00.000Z"

java - 使用值初始化 Properties 对象

java - Selenium 中的多个选项卡

javascript - 在 node.js 中断言值

java - 如果日期相同,为什么 assertEquals 为假? hibernate

java - 查找所有文件夹和子文件夹内容并像结构一样显示(Java)

arrays - 使用 assert_eq 或打印大型固定大小的数组不起作用

python - 引发AssertionError与断言python