繁体   English   中英

我们应该在Java中断言每个对象创建吗?

[英]Should we assert every object creation in java?

听起来像个愚蠢的问题,答案很明显:)

我还是冒险提出只是确定无疑的问题。

我们确实使用了下面给出的断言

ArrayList alProperties = new ArrayList();

assert alProperties != null : "alProperties is null";

问题在于,要根据断言制作一个小的简单文档很困难。 有很多关于断言的书,但理想情况下,我想给新程序员提供有关使用断言之类的非常简单的指导。 顺便说一句,像pmd这样的工具是否检查assert的正确使用?

提前致谢。

没有理智的理由使用这样的断言。 如果由于某种原因无法创建对象,则甚至不会达到您的断言(例如,因为引发了异常或退出了VM)

在《 Sun的带断言编程》中有一些使用断言的相当简洁的指南。 该文章建议断言应用于诸如内部不变量,控制流不变量以及前提条件,后置条件和类不变条件之类的事情。

不,您不想检查对象的创建。

如果对象创建失败,则jvm将抛出OutOfMemoryError,并且如果发生这种情况,您无论如何都可能无法修复。

就像不信任JVM。 关于给定的东西,你必须在某处画一条线...

在Java中,对new的每次调用都返回对新对象的非null引用,或者引发Exception或Error。 在第一种情况下,您的断言为true,在第二种情况下,将不会达到该断言,因为您将在下一个匹配的catch块中结束。

该断言测试您的Java实现是否中断,在这种情况下,您甚至不能依赖该断言。 因此,我不会做出这样的断言。 使用assert来限制对象,这些对象不是语言所强制执行的(例如,如果您的方法传递了一个参数,但该参数为null而不应该是)。

该断言只会使您的代码混乱,它等效于以下断言:

boolean a = true;
assert a : "A should be true"

除非那是程序的重点,否则您不应该测试JVM(例如,这是您要制作的JVM的测试套件)。 相反,您应该测试前置条件,后置条件和不变式。 有时这些测试太基础或太昂贵。

前提条件可能只应出现在方法的开头(如果您的方法很长,则应将该方法分成小部分,即使它们都是私有的)。

后置条件应使您清楚返回给调用方的内容,而不是测试sqrt函数是否刚刚返回了sqrt,但可以测试确定期望的内容是肯定的(也许以后的代码会使用复数,您的数字尚未经过测试)。 而是在底部留下评论。

不变式通常也无法测试,您无法测试当前的解决方案是否是正确的部分解决方案(请参阅下文),尽管这是用尾递归编写事物的好方法之一。 而是用注释声明不变量。

如果在外部调用事物,则还可以使用一个断言,例如,在示例中,如果您具有ArrayList.Create() ,则可以为null选择断言检查。 但这仅仅是因为您不信任其他代码。 如果编写了该代码,则可以将断言(注释或其他方式)放入工厂方法本身。

int max(int[] a, int n) {
  assert n <= a.length : "N should not exceed the bounds of the array"
  assert n > 0 : "N should be at least one"

  // invariant: m is the maximum of a[0..i]
  int m = a[0];
  for( int i = 1; i < n; n++ ) {
    if( m < a[i] )
      m = a[i];
  }

  // if these were not basic types, we might assert that we found
  // something sensible here, such as m != null
  return m;
}

我不确定是否完全理解您的问题,但是我认为这种主张不是必须的。

创建实例时,如果程序流程继续,则该实例不是空引用。

您希望ASSERTS检查程序的属性或不变式。 一个好的教学方法应该鼓励程序员以系统/方法的方式考虑这些特性。

如果断言失败,请相信我,与处理断言相比,您将遇到更大的问题。

如果断言失败了,我想是时候该找另一份工作了,因为计算机没有按照应有的方式运行,发生这种情况时,一切都会崩溃!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM