返回布尔值时编写彼此相反的方法的最佳实践是什么?

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();。添加它是因为在实践中发现它被许多用户所期望。