当前位置: 首页 > 面试题库 >

断言一个好习惯吗?

李森
2023-03-14
问题内容

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

问题答案:

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

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

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

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

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

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



 类似资料:
  • 问题内容: 我正在开发一个相对较大的Python应用程序,因此我希望保留几种资源,因为可以在多个不同模块中访问全局变量。这些值包括版本号,版本日期,全局配置以及一些指向资源的静态路径。我还包括了一个由命令行选项设置的标志,以便我可以在调试模式下运行应用程序而无需整个环境。 我一直在谨慎地确保要导入的值在程序运行过程中不会发生变化,并且我已将它们记录为不应被触及的全局常量变量。我的代码本质上看起来像

  • 问题内容: 我听说捕捞是一种不好的做法,我认为这样做是明智的。让传播到顶部将允许检测出问题。但是很多时候我已经看到很多朋友直接被捕获,因此他们不必理会上面代码中可能发生的所有不同种类的异常。这是一个好习惯吗?还有哪些其他最好不处理的例外情况?此外,对我来说,处理一个确定了异常源的特定代码对我来说也很有意义。那么什么时候处理异常,什么时候不应该处理?最好不处理的异常清单可能是什么? 问题答案: 宠物

  • 问题内容: 关于Javadoc的内容不多。(简而言之:它返回字符串的规范表示形式,从而允许使用来比较内部字符串==) 我什么时候可以使用此功能? 是否存在Javadoc中未提及的副作用,即JIT编译器或多或少的优化? 还有其他用途吗? 问题答案: 我何时会使用此函数来支持String.equals() 当你需要速度时,因为可以按引用比较字符串(==比等于快) 是否有Javadoc中未提及的副作用?

  • 问题内容: 我盯着2001年的一些旧代码,发现以下语句: 我以前从未见过,并在这里发现标记为的中断: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html 这本质上不像吗?使用它甚至是一种好习惯吗?这让我不安。 问题答案: 不,这不像goto,因为您不能“转到”控制流的另一部分。 在您链接的页面上: break语句

  • 问题内容: 通过Joshua Bloch的“ Effective Java-Second Edition”,我偶然发现了第152页上的以下代码: 现在令我困惑的是,主动抛出该异常。那被认为是好的做法吗?据我所知,断言用于避免与代码发生干扰,因此在启动Java编程时未启用断言且因此未执行断言语句时,行为不会改变。如果我在没有启用断言的情况下运行程序时得到一个提示,我就会很困惑。 尽管我知道示例案例可

  • 问题内容: 方法链接 是对象方法返回对象本身以使结果被另一个方法调用的实践。像这样: 这似乎被认为是一种好习惯,因为它会产生可读的代码或“流畅的界面”。但是,对我而言,它似乎打破了面向对象本身所隐含的对象调用表示法-生成的代码不代表对先前方法的结果执行的动作,通常这是面向对象的代码的工作方式: 这种差异设法为“调用结果对象”的点标记创建了两种不同的含义:在链接的上下文中,以上示例将被视为保存参与者