我非常清楚,在大多数结构化编程专业追随者的词典中,"goto"是一个肮脏的词。因此,我想问一下如何替换下面使用的"goto"。
我正在写一个桥梁招标应用程序。我问用户"谁交易了"。如果他这样做了,没问题。如果右边的玩家发了(东方),那么必须询问用户该玩家的出价。如果对方玩家发了牌(合作伙伴),用户必须被问到对方玩家的出价是多少,然后问东方是什么。如果用户左侧的玩家发了牌(West),则必须依次询问用户这三名玩家的出价。
我有一个活动"What bid",它显示一个屏幕,并根据谁出价通过"West"、"your partner"或"East"。该活动使用startActivityForResult调用,并返回所做的出价。现在事情是这样的。我认为这是最有效的方法:
if (whodealt == "West") {continue}
else if (whodealt == "North") {goto northbid;}
else if (whodealt == "East") {goto eastbid;}
westbid:
startActivityForResult() etc. passing "West";
process result (e.g. store bid)
northbid:
startActivityForResult() etc. passing "your partner";
process result (e.g. store bid)
eastbid:
startActivityForResult() etc. passing "East";
process result (e.g. store bid)
很明显,我已经简化了一切。但是下面的非goto结构不是有点麻烦吗,比如
if (whodealt == "West") {
startActivityForResult() etc. passing "West";
process result (e.g. store bid)
startActivityForResult() etc. passing "your partner";
process result (e.g. store bid)
startActivityForResult() etc. passing "East";
process result (e.g. store bid) }
else if (whodealt == "North") {
startActivityForResult() etc. passing "your partner";
process result (e.g. store bid)
startActivityForResult() etc. passing "East";
process result (e.g. store bid) }
else if (whodealt == "East") {
startActivityForResult() etc. passing "East";
process result (e.g. store bid) }
人们对此有何看法?
您所描述的基本上是一个带有失败的switch语句:
switch(whodealt) {
case WEST:
// startActivityForResult() etc. passing WEST;
// process result
// fall through
case NORTH:
// startActivityForResult() etc. passing NORTH;
// process result
// fall through
case EAST:
// startActivityForResult() etc. passing EAST;
// process result
// fall through
case SOUTH: // (the player dealt themselves)
break;
default:
throw new IllegalArgumentException("Unrecognised Dealer");
}
Java从Java7开始就支持开关语句中的Strings,但我建议不要使用字符串,而是为经销商定义自己的枚举:在这种情况下,whodealt
只能容纳有限的值域,而且它比所有Strings的域小得多。
Java没有goto语句。goto在Java中是一个保留关键字,但该语言不使用它。请参阅此问题以获得更完整的答案。
Java中有goto语句吗?
要回答您的问题"在Java中使用'goto'是否有效",答案必须是否定的,因为这在Java中是不可能的。
如果右边的玩家发了(东部),那么必须询问用户该玩家的出价。如果对方玩家出价(合作伙伴),则必须询问用户对方玩家出价的内容,然后询问东方。如果用户左侧的玩家>发牌(西部),则必须依次询问用户这三名玩家的出价。
对于责任链来说,这似乎是一个很好的情况,尤其是如果你想实现更多的逻辑代码。否则,我会建议使用类似@amnn的switchcase语句。