Java - 我的控制流程更好的习惯用语

时间:2012-02-03 12:08:23

标签: java

我想调用一个返回false或整数的方法。目前我的代码是:

int winningID = -1;
if((ID = isThereAWinner()) != -1) {
    // use the winner's ID
} else {
    // there's no winner, do something else
}

private int isThereAWinner() {
    // if a winner is found
    return winnersID;
    // else
    return -1;
}

我不喜欢if((ID = isThereAWinner()) != -1)位,因为它读得不太好,但与C不同,你不能将布尔值表示为Java中的整数。有更好的方法吗?

7 个答案:

答案 0 :(得分:4)

我会使用类似Mat的答案:

class Result {
    public static Result withWinner(int winner) {
        return new Result(winner);
    }

    public static Result withoutWinner() {
        return new Result(NO_WINNER);
    }

    private static final int NO_WINNER = -1;

    private int winnerId;

    private Result(int id) {
        winnerId = id;
    }

    private int getWinnerId() {
        return winnerId;
    }

    private boolean hasWinner() {
        return winnerId != NO_WINNER;
    }
}

如果根本没有获胜者,该课程会隐藏实际细节。

然后在你的获胜者发现方法中:

private Result isThereAWinner() {
    // if a winner is found
    return Result.withWinner(winnersID);
    // else
    return Result.withoutWinner();
}

在您的通话方式中:

Result result = isThereAWinner();
if(result.hasWinner()) {
    int id = result.getWinnerId();
} else {
    // do something else
}

看起来有点过于复杂,但如果将来有其他结果选择,这种方法会更灵活。

答案 1 :(得分:3)

如下:

private int getWinnerId() {
  // return winner id or -1
}

private boolean isValidId(int id) {
  return id != -1; // or whatever
}
int winnerId = getWinnerId();
if (isValidId(winnerId)) {
  ...
} else {
  ...
}

这当然是非常主观的,但你通常希望isFoo方法只提供是/否"答案"。

答案 2 :(得分:2)

问题是你试图一次返回两个值。你采取的方法最简单。如果你想要更多OO或设计模式方法,我会使用一个监听模式。

interface WinnerListener {
    void onWinner(Int winnerId);
    void noWinner();
}

checkWinner(new WinnerListener() {
    // handle either action
});

private void checkWinner(WinnerListener wl) {
    // if a winner is found
    wl.onWinner(winnersID);
    // else
    wl.noWinner();
}

这种方法适用于复杂事件,如多个参数和多个不同的事件。例如您可以有多个获胜者或其他类型的活动。

答案 3 :(得分:1)

我不敢。为避免错误导致的错误if(a == b)if(a = b),Java删除布尔类型和数字类型之间的转换。也许您可以尝试异常,但我认为异常更麻烦一些。 (我的英语不太好。我想知道我是否说得很清楚......)

答案 4 :(得分:0)

也许您可能希望考虑例外来帮助您理解编码的美学。

答案 5 :(得分:0)

使用Integer而不是int并返回null而不是-1。从这一点来看:“我返回的不是整数,而是一些代表胜利者身份的对象。没有赢家 - 没有实例”

答案 6 :(得分:0)

乔的另一个建议,这是基于前面提到的@Mat和@buc构建的,再次这是主观的,当然我不确定你的类/逻辑的其余部分是什么。如果在代码/ exmaple的上下文中有意义,则可以引入具有不同ResultStatuses的枚举。

正如Matt所说,你会期望isValid方法返回一个布尔值yes / no(有些人可能还会抱怨可读性)

public enum ResultStatus {
    WINNER, OTHER, UNLUCKY
}

这也可能是一种矫枉过正,取决于你的其余逻辑(如果逻辑正在扩大),但我想我会建议我的两分钱!因此,在您的公共类(类似于@bloc建议)中,您可以使用下面的方法返回已检查结果的状态。

public ResultStatus getResultStatus() {
    if (isWinner()) {
        return ResultStatus.WINNER;
    } else {
        return isOtherCheck() ? ResultStatus.OTHER : ResultStatus.UNLUCKY;
    }
}