这是在 Java 中使用'goto'的有效案例吗



我非常清楚,在大多数结构化编程专业追随者的词典中,"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语句。

最新更新