【问题标题】:is `contract of a class` only defined by public interface?“类的契约”是否仅由公共接口定义?
【发布时间】:2019-07-09 00:21:08
【问题描述】:

我在Her 上阅读有关“类合同”的内容,似乎每个人都表示它仅适用于public 属性和方法。是这样吗?

我认为类的契约不仅限于公共接口,还包括私有方法和字段。因此,在大多数情况下,方法的行为方式——它的访问修饰符、返回类型和抛出的异常——都在合同中。

例如下面的方法: private String returnString() 仍然遵守将返回String 的合同。我错了吗?

【问题讨论】:

  • 它只会在定义该方法的类中返回一个字符串,因为它是私有的......合同更多的是对外界可见/可用的内容
  • 客户不关心(也不应该)私有方法。
  • @RobOhRob 是不是方法的返回类型和抛出的异常符合合同?就像一个类保证方法只会返回一个String类型并且只会抛出一些异常。不是合同吗?

标签: java


【解决方案1】:

private 方法未公开,因此不能成为任何 public 合约的一部分。

遵守契约(例如通过接口)的类保证它将向下游消费者公开某些public 方法,有时还会公开字段。如何履行合同是一个实现细节,通常通过私有方法执行。

【讨论】:

  • 方法的返回类型和抛出的异常不是合同约定的吗?就像一个类保证方法只会返回一个String 类型并且只会抛出some Exception。不是合同吗?
  • 除了方法的签名(由编译器检查)之外,还可以添加某些前置条件、后置条件和不变量(在 java 文档/规范中记录并由实现的程序员)。例如。 List<T> sort(List<T> items) 方法不仅会返回 List<T>,而且该列表也会被排序。
  • @lynxx:返回类型不是方法正式签名的一部分。此外,您仍然指的是私有方法。这是一个类比——假设你和朋友出去吃午饭,你想支付你的部分。本合同面向公众的部分是您将支付费用。 如何支付是一个实施细节;您可以取出现金或信用卡或通过 PayPal 支付给餐桌旁的其他人。在公共场合,你要为你的饭钱买单。私下里,你正在确定资金的来源。如果您使用现金而不是信用卡或 PayPal,则不会违反支付餐费的合同。
  • @Makoto 我不是在谈论私有方法的情况。对于这个方法,public String getName() 我们可以保证返回类型是String。我可以说该方法根据合同只返回String 吗?那么在这里,guaranteecontract 这两个术语在这种情况下是否不同?
  • @lynxx: 不……不一定。除非这在编译时实际上是可执行的(例如通过接口或抽象类),因为the return type of a method is not part of the method signature。您可以声称存在getName 将返回String 的隐含合同,但很少有人这样做;更多的是关于getName 实际返回的内容。它会返回名字吗?第一和最后?全名? 那些是更相关的合同细节。
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
相关资源
最近更新 更多