返回布尔值时编写彼此相反的方法的最佳实践是什么?
What is the best practice for writing methods that are opposite of each other when returning a boolean?
我正在学习条件语句,想知道对于类似情况这是否是一个糟糕的惯例。我应该在不使用 isEven() 的情况下定义 isOdd() 吗?
static boolean isEven(int i) {
return i % 2 == 0;
}
static boolean isOdd(int i) {
return !isEven(i);
}
这样的方法太过分了。只要检查 isEven returns false 就会告诉你它是奇数。
不,那绝对没问题,并且积极鼓励代码重用 - 当然,如果您确实需要这两种方法。调用者使用!isEven(...)
真的太难了吗?有时,为了调用方的可读性,可能是值得的,但我建议您首先仔细考虑。
但是,我 不鼓励的是 isEven
使用 if
语句的方法,其中主体只是 returns true 或 false .这总是可以通过返回条件来替换:
static boolean isEven(int i) {
return i % 2 == 0;
}
我不知道有任何特定的约定。
我会选择重用策略,所以你只需要维护一个实现,以备更正或进化。而且您(或您的继任者)不会忘记更新一半的代码...
您可能会遇到此问题的更常见情况是 class 的实例具有自然顺序,并且可以相互比较。
在Java中,你会实现Comparable
.的compareTo(T)
方法如注释所说,建议compareTo()
与equals()
保持一致.确保并最大化代码重用的一种方法是根据 compareTo()
:
定义 equals()
final class MyComparable implements Comparable<MyComparable> {
/* Some fields that are used for sorting. */
...
@Override
public int compareTo(MyComparable that) {
/* Compare the fields of this and that and return a signed result */
...
}
@Override
public int hashCode() {
/* Define hash in terms of members used for sorting too. */
...
}
@Override
public boolean equals(Object obj) {
/* Re-use the definition of natural ordering to define equality. */
return (obj instanceof MyComparable) && (compareTo((MyComparable) obj) == 0);
}
}
在很多情况下确实是很好的做法。有时,Java API 源代码可以作为良好实践的一个很好的例子。
在 Java 8 中,class Optional
有一个方法 isPresent()
,想要知道对象是否不存在的用户必须使用 !isPresent()
.
在 Java 11 中,他们添加了 Optional.isEmpty()
,其源代码只是 return !isPresent();
。添加它是因为在实践中发现它被许多用户所期望。
我正在学习条件语句,想知道对于类似情况这是否是一个糟糕的惯例。我应该在不使用 isEven() 的情况下定义 isOdd() 吗?
static boolean isEven(int i) {
return i % 2 == 0;
}
static boolean isOdd(int i) {
return !isEven(i);
}
这样的方法太过分了。只要检查 isEven returns false 就会告诉你它是奇数。
不,那绝对没问题,并且积极鼓励代码重用 - 当然,如果您确实需要这两种方法。调用者使用!isEven(...)
真的太难了吗?有时,为了调用方的可读性,可能是值得的,但我建议您首先仔细考虑。
但是,我 不鼓励的是 isEven
使用 if
语句的方法,其中主体只是 returns true 或 false .这总是可以通过返回条件来替换:
static boolean isEven(int i) {
return i % 2 == 0;
}
我不知道有任何特定的约定。
我会选择重用策略,所以你只需要维护一个实现,以备更正或进化。而且您(或您的继任者)不会忘记更新一半的代码...
您可能会遇到此问题的更常见情况是 class 的实例具有自然顺序,并且可以相互比较。
在Java中,你会实现Comparable
.的compareTo(T)
方法如注释所说,建议compareTo()
与equals()
保持一致.确保并最大化代码重用的一种方法是根据 compareTo()
:
equals()
final class MyComparable implements Comparable<MyComparable> {
/* Some fields that are used for sorting. */
...
@Override
public int compareTo(MyComparable that) {
/* Compare the fields of this and that and return a signed result */
...
}
@Override
public int hashCode() {
/* Define hash in terms of members used for sorting too. */
...
}
@Override
public boolean equals(Object obj) {
/* Re-use the definition of natural ordering to define equality. */
return (obj instanceof MyComparable) && (compareTo((MyComparable) obj) == 0);
}
}
在很多情况下确实是很好的做法。有时,Java API 源代码可以作为良好实践的一个很好的例子。
在 Java 8 中,class Optional
有一个方法 isPresent()
,想要知道对象是否不存在的用户必须使用 !isPresent()
.
在 Java 11 中,他们添加了 Optional.isEmpty()
,其源代码只是 return !isPresent();
。添加它是因为在实践中发现它被许多用户所期望。