【问题标题】:Conventions regarding the return type for add() methods关于 add() 方法的返回类型的约定
【发布时间】:2015-07-08 20:41:39
【问题描述】:

add(...) 方法的 Java 编程约定是什么?示例:

  • TreeSet: public void add(...)
  • BigInteger: public BigInteger add(...)

为什么TreeSet的返回类型是void,而BigInteger的返回类型是BigInteger

我什么时候应该在自己的方法中使用 void?

【问题讨论】:

标签: java conventions


【解决方案1】:

如果您的add 操作是不可变的,它应该返回一些值(BigInteger 就是这种情况)。否则你应该返回voidCollection的情况,例如TreeSet)。

【讨论】:

    【解决方案2】:

    这是一种设计选择。它主要围绕您是否希望您的对象(实例)是可变的或不可变的问题。

    一个集合,包括TreeSet 是可变的,因为显然你想向它添加元素。通过向自身添加对象,您可以“更改”实例及其包含的值。它不必返回任何东西。但是,一些开发人员喜欢能够链接多个操作,所以如果你想要这样的东西:

    TreeSet set = new TreeSet();
    set.add(oneElement).add(anotherElement);
    

    那么是的,您可能选择了另一个 TreeSet(本身)作为返回类型,而不是使用 void 作为返回类型。选择是为我们做出的:它是无效的。

    BigInteger 被设计为不可变的(包含的值不能更改)。因此,与其更改自己的值,不如返回一个新的实例,就像它自己一样,但具有新的值。 BigInteger 上没有可用的“setXxxx()”方法,可让您获取现有 BigInteger 实例的值。

    [更新]

    好吧 - 你差点让我在那里。 TreeSet::add 没有 void 而是 boolean 作为返回类型。所以这是另一个设计选择...... TreeSet 不仅是一个可变对象,他们还想要在尝试添加元素后有用:add 是否成功。这是因为 Set,包括 TreeSet 只添加和包含不同的元素。如果元素已经存在,则不会再次添加,add 方法会返回一个false

    【讨论】:

      【解决方案3】:

      基本上是在有意义的时候。如果您将项目添加到集合或其他类型的添加实际上不会返回任何内容,而只是对对象起作用,请使用void。如果您将一个数字与另一个数字相加,就像 BigInteger 的 add 函数一样,您可以返回总和。

      【讨论】:

        【解决方案4】:

        这真的取决于;通常,如果这样做“有意义”,则返回对象本身的实例。在您的特定示例中,您看到了不可变对象和可变对象之间的区别。 TreeSet 实例是可变的,当您在实例上调用 add 时,该实例会被修改。 BigInteger 实例是不可变的,所以当你添加它时,你会得到一个包含两个值之和的新实例;原始实例保持不变。

        在某些情况下,该方法可能会返回一个自身的实例,因为它可用于提供流畅的接口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-04
          相关资源
          最近更新 更多