我在解决问题的同时,最近在Java中发现了assert
关键字。起初,我很兴奋。一些有用的东西,我不知道!一种更有效的方式来检查输入参数的有效性!耶学习!Java断言是否被破坏?
但后来我拿了仔细一看,和“锻炼”为“扼杀出完全”由一个简单的事实,我的热情就没有那么多:你可以把断言关闭*
这听起来就像一场噩梦。如果我声称如果输入listOfStuff
为null
,我不希望代码继续运行,那么为什么我会希望该断言被忽略?这听起来像是如果我正在调试一段产品代码,并怀疑listOfStuff
可能错误地通过了null
,但没有看到任何日志文件证据表明该断言被触发,我不能相信listOfStuff
实际上发送了一个有效的值;我还必须说明断言可能完全被关闭的可能性。
这个假设我是一个调试代码的人。有些不熟悉断言的人可能会看到并假设(相当合理),如果断言消息没有出现在日志中,listOfStuff
就不成问题。如果你的第一次遇到assert
是疯狂的,你会发现它可能完全被关闭吗?毕竟,这不像是有一个命令行选项可以让你禁用try/catch块。
所有这一切使我对我的问题(这是一个问题,而不是夸夸其谈的借口我保证!):
我缺少什么?
是否有一些细微差异让Java的实现assert
远比我给它的功用更有用?在某些情况下,从命令行启用/禁用它的能力实际上是非常有价值的吗?当我设想在生产代码中使用它代替if (listOfStuff == null) barf();
等语句时,我是否会误解它?
我只是觉得这里有一些重要的东西,我没有得到。
*好的,从技术上讲,它们实际上是默认关闭的;你必须竭尽全力打开它们。但是,仍然可以完全敲除它们。
编辑:启示要求,启发收到。
assert
首先是一个调试工具,这个概念对我来说意义重大。
我仍然认为应该在生产环境中禁用非平凡私有方法的输入检查,因为开发人员认为不好的输入是不可能的。根据我的经验,成熟的生产代码是一个疯狂的,庞大的事物,多年来由具有不同程度技能的人开发,针对不同程度的理智的快速变化的要求。即使不好的投入是不可能的,从现在开始六个月的一段草率维护编码可以改变这种状况。 The link gustafc provided(!感谢)包括本为例:
assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval;
禁止生产这种简单的检查,在我看来是愚蠢乐观。但是,这是编码哲学的一个区别,而不是一个破碎的特征。
另外,我可以肯定看到的是这样的值:
assert reallyExpensiveSanityCheck(someObject) : someObject;
我要感谢大家谁花时间帮我明白这个功能;这是非常赞赏。
这看起来很像一个咆哮,而不是一个问题。 – 2010-05-03 15:39:29
你曾经在C或C++中使用过ASSERT吗?你有没有希望你可以打开或关闭他们的手指? – 2010-05-03 15:46:51
@Joachim:我明白了,但是很认真,我在这里寻找启示。这个功能对我来说确实确实有些破裂 - 但这种感觉完全等同于说“我的代码没有看到什么问题,因此编译器必须被破坏!”,只是在更高的层面上。我真的觉得我错过了一些东西。如果你能为我提供一种方式来表达,为什么这个功能让我觉得不如破碎,这不会引起你的咆哮,我正在倾听。 – BlairHippo 2010-05-03 15:47:14