[英]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.