我想调用一个返回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中的整数。有更好的方法吗?
答案 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;
}
}