add(...)
方法的Java编程约定是什么?例如:
TreeSet
:public void add(...)
BigInteger
:public BigInteger add(...)
为什么TreeSet
返回类型无效,而BigInteger
返回类型为BigInteger
?
我应该在自己的方法中何时使用void?
答案 0 :(得分:2)
如果add
操作是不可变的,它应该返回一些值(这是BigInteger
的情况)。否则,您应该返回void
(Collection
的情况,例如,TreeSet
)。
答案 1 :(得分:1)
这是一个设计选择。它主要围绕您是否希望您的对象(实例)是可变的或不可变的问题。
包括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
。
答案 2 :(得分:0)
基本上当它有意义时。如果您要将某个项目添加到某个集合或其他类型的添加内容,但实际上并未返回任何内容,只需使用void
。如果您要将数字添加到其他数字,例如BigInteger的添加功能,则可以返回总和。
答案 3 :(得分:0)
这取决于;通常你会返回一个对象本身的实例,如果它有意义的话#34;这样做。在您的特定示例中,您将看到不可变对象和可变对象之间的区别。 TreeSet
个实例是可变的,当您在实例上调用add
时,会修改同一个实例。 BigInteger
个实例是不可变的,所以当你添加它时,你得到一个带有两个值之和的新实例;原始实例保持不变。
在某些情况下,该方法可能会返回自身的实例,因为它可用于提供流畅的界面。