Tag: 按合同设计

何时在客户端和通用GWT代码中使用assert

StackOverflow上有几个问题讨论了何时应该使用assert语句而不是抛出一些exception的问题。 ( 这里 , 这里 , 这里 , 这里和这里的例子。 但是,我开始怀疑assert-versus-throw的传统智慧是基于您在JVM中运行的假设。 在GWT世界中,您的Java被音译为JavaScript并在浏览器的上下文中运行,这一组权衡感觉不同:在浏览器中运行时,断言总是被编译掉,而任何使JavaScript的大小变小的东西是一个胜利,特别是如果你的网络应用程序必须在手机上运行。 断言确实可以在DevMode中运行,因此它们在开发过程中具有实用性。 所以我的问题是:有没有人考虑过一套最佳实践规则来管理如何在GWT中使用断言语句? 我有我的团队成员问我“因为断言被编译出来,拥有它们是否有意义?”,我想对他们有一个好的答案。 此外,是否有人对Google的GWT开发人员在此主题上的理念有所了解? 查看GWT源代码,他们似乎经常使用它。

Java声明断了吗?

在探讨问题时,我最近在Java中发现了assert关键字。 起初,我很兴奋。 我还不知道有用的东西! 一种更有效的方法来检查输入参数的有效性! 耶老师! 但后来我仔细研究了一下,我的热情并没有像一个简单的事实那样“完全被扼杀”而变得“脾气暴躁”:你可以关闭断言。* 这听起来像是一场噩梦。 如果我断言如果输入listOfStuff为null ,我不希望代码继续运行,为什么我想要忽略该断言呢? 听起来好像我正在调试一段生产代码并怀疑listOfStuff可能错误地传递了null但是没有看到任何触发该断言的日志文件证据,我不能相信listOfStuff实际上已经发送了一个有效的值; 我还必须考虑断言可能完全被关闭的可能性。 这假设我是调试代码的人。 不熟悉断言的人可能会看到并且(非常合理地)假设如果断言消息没有出现在日志中,则listOfStuff可能不是问题。 如果你第一次遇到assert是在野外,你甚至会发现它可以完全被关闭吗? 毕竟,它不像是一个允许你禁用try / catch块的命令行选项。 所有这些都让我想到了我的问题(这是一个问题,而不是一个咆哮的借口!我保证!): 我错过了什么? 是否有一些细微差别使得Java的assert实现远比我给它的功劳更有用? 在某些情况下,从命令行启用/禁用它的能力实际上是非常有价值的吗? 当我设想在生产代码中使用它来代替if (listOfStuff == null) barf();等语句时,我是否误解了它if (listOfStuff == null) barf(); ? 我觉得这里有一些重要的东西,我没有得到。 *好的,从技术上讲,它们实际上是默认关闭的; 你必须不遗余力地打开它们。 但是,你仍然可以完全击败他们。 编辑:启蒙要求,启示收到。 assert首先是一个调试工具的概念需要很长时间才能使它对我有意义。 我仍然认为应该在生产环境中禁用输入检查非平凡私有方法的概念,因为开发人员认为不可能输入错误。 根据我的经验,成熟的生产代码是一种疯狂的,庞大的东西,多年来由具有不同技能的人们开发,其目标是快速变化的不同程度的理智要求。 即使糟糕的输入确实是不可能的,从现在起六个月后的一段邋maintenance的维护编码也可以改变这一点。 提供的链接gustafc (谢谢!)包括这个例子: assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval; 禁用如此简单的生产检查让我感到愚蠢乐观。 然而,这是编码哲学的差异,而不是破碎的特征。 另外,我绝对可以看到这样的价值: […]

Java:调用hashCode()和equals()时自动抛出UnsupportedOperationException的干净方法?

我们有一个OO代码库,在很多情况下hashcode()和equals()根本不起作用,主要是由于以下原因: 除非您愿意放弃面向对象抽象的好处,否则无法扩展可实例化的类并在保留equals合同的同时添加值组件。 这是Joshua Bloch撰写的“Effective Java”的引用,在这篇伟大的Artima文章中有关于该主题的更多内容: http://www.artima.com/lejava/articles/equality.html 我们完全没问题,这不是这个问题的意思。 问题是:看到事实是在某些情况下你不能满足equals()契约,自动生成hashcode()和equals()的干净方法会抛出UnsupportedOperationException吗? 注释会起作用吗? 我正在考虑像@NotNull这样的事情:每个@NotNull合同违规都会自动抛出一个exception,除了用@NotNull注释你的参数/返回值之外别无他法。 它很方便,因为它是8个字符(“@NotNull”)而不是不断重复相同的validation/抛出exception代码。 在我关注的情况下,在hashCode()/equals()没有意义的每个实现中,我们总是重复相同的事情: @Override public int hashCode() { throw new UnsupportedOperationException( “contract violation: calling hashCode() on such an object makes no sense” ); } @Override public boolean equals( Object o ) { throw new UnsupportedOperationException( “contract violation: calling equals() on such an object makes no sense” […]