set类的add运算符返回一个布尔值,如果元素(要添加的元素)不存在则为true,否则为false。在写字
if (set.add(entry)) {
//do some more stuff
}
在编写简洁的代码方面被认为是好的风格?我想知道既然您一次执行两项操作。1)添加元素,2)检查元素是否存在。
if (!set.add(entry)) {// entry already present, possibly a case you want to handle}
set类的add运算符返回一个布尔值,如果元素(要添加的元素)不存在则为true,否则为false。在写字
if (set.add(entry)) {
//do some more stuff
}
在编写简洁的代码方面被认为是好的风格?我想知道既然您一次执行两项操作。1)添加元素,2)检查元素是否存在。
if (!set.add(entry)) {// entry already present, possibly a case you want to handle}
Answers:
是的。
使操作返回布尔值的通常点是,您可以使用它来进行决策,即在if
构造内。您可以意识到这种潜力的唯一另一种方法是将返回值存储在变量中,然后立即在中使用它if
,这很愚蠢,而且肯定不比编写任何方式可取if(operation()) { ... }
。因此,只要继续执行此操作,我们就不会(因此)判断您。
Set.add
单个操作而不使用其他方法。如果预期的操作是添加单个元素并确定是否已添加,则不需要更强大的替代方案,而该替代方案仍会使操作复杂而无益。希望您知道这Set.add
是一种内置的JRE方法,无需先学习700页以上的书即可使用。
我会说它不是尽可能干净,因为它迫使维护者已经知道或查找返回值的含义。这是否意味着已经成功插入了不存在的值?如果您不经常使用它,您将不会知道,即使这样做,也要花很多心思。
我希望以下内容:
boolean added = set.add(entry);
if (added) {
//do some more stuff
}
是的,有点冗长,但是编译器应该生成几乎完全相同的字节码,即使多年未使用Java集的人也可以遵循逻辑而无需查找任何内容。
add
如果该元素尚未存在,则返回true,否则返回true。(问题的措词是令人误解的。)
Set.add
,那么您是没有经验的人,应该通过这些方法来学习它们并变得更有经验。
notAlreadyPresent
不是最好的措辞。我将使用added
,并希望读者知道为什么不将值添加到Set中。
如果为true表示成功,那么这是很好的清晰代码。
有一个普遍的约定,即函数或方法在成功时返回true(或某些结果为true)。只要您的代码遵循该规则,我认为将方法置于条件中就可以了。
在我看来,这样的代码不必要地混乱了:
boolean frobulate_succeeded = thing.frobulate();
if (frobulate_succeeded) {
...
}
感觉就像您在重复自己。
但是,问题在于返回值的含义。您说“一个布尔值,它指示添加的元素是否已经存在”,这可能意味着true表示该元素存在(并且未发生添加)。如果真是这样,我理想上将方法的返回行为更改为更常规。如果不可能,我将添加一个额外的中间变量,该变量使您可以在代码中清楚地标记返回结果(如其他人所建议)。
false
意味着未添加该元素是因为该元素已经被包含,并且true
意味着该元素尚未被包含。add()
如果该元素尚未包含在集合中,则As 将其添加到集合中,true
因此意味着该元素已成功添加到集合中。
add
无需执行任何操作即可成功。如果该商品尚未在集合中,则将其add
添加到集合中即可成功。哪种解释正确是任意的。从语言中可以看出,对成功的定义不太那么随意:如果该方法正常返回,则该方法成功。
firstLessThanSecond(int l, int r)
,并且返回true
if l > r
或false
if l <= r
,则该方法即使成功返回也不会成功。
add
是合同的缩写。文档开始于“将指定的元素添加到该集合中(如果尚不存在)”,无论该项目是否已经存在于集合中,这都可以满足。您可以随意解释返回值,但最终只是您的解释。在第二个示例中,该方法评估条件是否为真。如果条件为假,则该方法当然不会失败,因为它已成功评估了条件。
我会说这非常像C。在大多数情况下,我希望使用一个描述性名称的变量来表示突变结果,并且在某种if
情况下不会发生突变。
如果立即重用此变量,则编译器将消除该变量。人类将更容易阅读源代码。对我来说,这更重要。
如果有人必须通过在if条件中添加and
/ or
子句来扩展条件,则.add()
由于短路评估,在某些情况下,他们可能最终不会调用。除非特别预计会发生短路,否则可能会导致错误。
if (set.contains(entry)){set.add(entry); //do more stuff}
的话,编译器也消除了吗?
contains
和之间的语义链接add
。此外,它还可以完成entry
在集合中查找的双重工作。这对于很大的集合和非常轻的循环可能会起作用。
if (set.contains(entry)){set.add(entry); //do more stuff}
而是改用卡尔·比勒费尔特的答案?
您的代码似乎破坏了命令查询分离。清洁代码书和功能结构视频中对此进行了讨论。因此,从“简洁代码”的角度来看,我认为它不是好样式。
“干净的代码既简单又直接。干净的代码读起来像写得很好的散文。简洁的代码永远不会掩盖设计者的意图,而是充满清晰的抽象和直接的控制线。
-Grady Booch的《面向对象的分析和应用程序设计》一书的作者”
对我来说,您代码的意图尚不清楚。如果在添加条目成功时成功执行了if,或者在已经存在时成功执行了if操作?什么add()
回报?该项目?错误代码?
if (set.contains(entry)){set.add(entry); //do more stuff}
看起来很傻的东西。您对此有何看法?
Collection
api。
java.util.Set
,它add
在元素不存在时返回true ,对吧?