Java interfaces - What exactly is in the contract?
我知道并理解Java中接口的价值。您可以对接口进行编码,然后可以更改实现,而无需更改任何使用该接口的代码。通常,术语"契约"用于与接口相关的方面。我理解它的方式是接口定义应用程序和实现之间的"契约"。
所以,当我创建一个实现时,我必须完成这个契约。我的问题是,我必须履行的合同到底是什么?
显然,至少您必须提供与接口具有相同签名的方法。否则代码将无法编译。这就是"合同"所包含的全部内容吗?似乎应该有更多。
例如,我读过一些文章,讨论测试接口和测试特定实现的价值,或者两者兼而有之。我看到了对接口进行测试的巨大价值,这样您就知道什么输入具有什么预期的输出。在我看来,这也是接口"契约"的一部分。接口的每个实现都应该从相同的输入产生相同的输出。显然,代码中没有强制执行这个契约的方法,但是可以通过测试用例强制执行。我在这里的想法是错的吗?
最后,实现的副作用是什么?这里,我主要讨论作为实现的一部分可能发生的任何持久性。假设我有一个实现,它在执行操作时将一些记录保存到数据库中。这会是接口"合同"的一部分吗?如果是这样,你怎么能执行这个合同?从接口层来看,我不知道实现实际上在做什么。我只知道我给它输入,它给我一个输出,我可以测试。发生的任何持久性是否也被视为"输出"?如果是这样的话,我只是不知道如何测试和强制执行。我是坚持无知的支持者,所以我知道有些东西应该被坚持,但我不知道它是如何被坚持的。所以,我只是不知道什么时候某些东西会持续存在。如果您的接口有一些简单的CRUD操作,这可能很简单,但我想考虑更复杂的接口。
我希望我的问题是有意义的,有人可以提供一些好的反馈。我想一般地讨论这个问题,但是如果不清楚我在说什么,我可以提供一个具体的例子。
我认为"契约"和"接口"的共同点非常少。
接口就像一扇门。一扇门可以通过典型的人类,但不能通过大象、长颈鹿或汽车。
合同就是你可以通过门保证只有女性、男性或软件开发人员会来。
所以契约定义行为,而接口定义传递哪些信息
我认为你对"合同"这个词做得太大了。
"埃菲尔"有一个非常具体的"合同设计"理念。就个人而言,我认为其他语言也会从类似的东西中受益。
非正式地,你当然可以把Java的"接口"看作是一个"契约"。您对Java接口的定义肯定是好的:
at a minimum you have to provide methods with the same signatures as
the interface. The code won't compile otherwise.
问:这就是所有的"合同"所包含的内容吗?
A:可能没有。这完全取决于你如何定义"合同";)
但是,IMHO,Java接口比C++的"多重继承"更为清洁。两者背后的一个主要动机是支持"混血儿":
同样,Java集成还提供了一种干净、相对简单的类型保存解决方案来支持"回调"。
最后建议:请考虑"接口"和"抽象类"的区别。这也可以让您更深入地了解Java接口,以及如何在自己的代码中有效地使用它们。
接口与抽象类(常规OO)
所以契约是方法签名+与函数/类相关的任何文档。这是一个接口,它并不意味着Java关键字EDOCX1 0的含义相同。接口是允许您与另一个系统交互的任何东西。因此,关于如何履行这样宣布的职能的合同的问题:
1 2 3 | /** Throws IllegalArgumentException if s is null. Converts the input s into an {@link Integer} */ function go(String s); |
您需要编写一个实现,如下所示:
1 2 3 4 5 | function go(String s) { if(null == s) throw new IllegalArgumentException(); int i = Integer.parseInt(s); } |
是的,但这应该解释如何执行合同并遵守它。