【问题标题】:Alternative to goto statement in JavaJava 中 goto 语句的替代方案
【发布时间】:2015-02-24 02:48:33
【问题描述】:

好的,所以我确定这个问题已经被打死了,但我仍然找不到我的项目需要的答案。

我正在用 java 构建一个赌场游戏套件(我 110% 确信有更好、更简单的语言,但我现在正在学习 java,我想用 java 编写代码实践。) 我的问题是我无法弄清楚如何构建我的代码。我习惯于使用 goto 语句(我开始在小的基础上学习编码)。例如:

import java.util.*;

public class CasinoGames
{
  public static void main(String[] args)
  {
    Scanner keys = new Scanner(System.in);
    sopln("Hello, and welcome to Casino Games!");
    sopln("Would you like to login, register, or play as a guest?");
    char token = keys.nextLine().toLowerCase().charAt(0);
    randomlabelhere:
    if (token == "l")
      User.login();
    else if (token == "r")
      User.register();
    else if (token == "g")
      User.guestLogin();
    else
      sopln("Invalid Choice, please try again!");
      goto somerandomlabel

我知道这不会编译,所以请不要提及。我知道我可以为此使用 do-while 循环,但如果我想要执行 goto 的选项,我有什么替代方案?

【问题讨论】:

  • 不要试图用基本的逻辑和结构来创建Java程序。而是学习和使用 OOP 思想。总之,放开你的goto,继续前进。
  • @HovercraftFullOfEels 您正在考虑结构化编程,而不是 OOP。 goto 与 OOP 无关。
  • 我猜大概是那个时候 :P 我其实打算使用 do-while-loop,但只是想知道是否有类似的声明 ^_^ @HovercraftFullOfEels

标签: java goto


【解决方案1】:

另外,token == "l" 不是 String 比较在 Java 中的工作方式,您想要更像 "l".equals(token) 的东西

此外,tokenchar 的一种类型,因此它应该更像token == '1',但您可以使用Stringtoken.trim().startsWith("1"),但您需要测试null 结果

【讨论】:

  • 我发这个后才发现,我居然把它改成了:!token=='l',我相信是char比较。
  • @AustenClay 不完全;这是token != 'l'!(token == 'l')
  • @AustenClay 是的,但是您的代码不会编译为 Stringchar 不兼容。您也可以使用StringstartsWith 作为比较,但这归结为需求
  • @Dev 可能,但让我们把它留在家里
  • @TNT 好的,我知道是这样的,我只是不确定具体细节,我想是时候去看教科书了:P
【解决方案2】:

Java 与goto 最接近的是breakcontinue 的标签。 Goto 成为 considered harmful 的时间比 Java 成为一种语言的时间长,因此 Java 没有 goto 实现(并且 gotoreserved word,所以你不能添加一个)。最后,由于tokenchar,你应该与char 类似

while(true) {
  if (token == 'l')
    User.login();
  else if (token == 'r')
    User.register();
  else if (token == 'g')
    User.guestLogin();
  else {
    sopln("Invalid Choice, please try again!");
    continue;
  }
  break;
}

【讨论】:

  • AFAIK goto 是一个保留字,以防他们决定有一天添加它。
  • 是的,但是如果您使用中断,那么它会跳过该标记块,对吗?此外, continue 只能在循环中使用 ^_^
  • @immibis 实际上,Jasmin(Java 汇编程序)包含一个 goto(因为 JVM 从第一天起就拥有它)。
  • @ElliotFrisch 是的,但这不是我们正在谈论的 Java 语言。
  • @immibis 我知道,但是说 如果他们决定在某一天添加​​它 已经添加它有点不诚实。也许万一他们决定有一天启用它,或者也许应该释放
【解决方案3】:

如果您愿意,您可以采用 goto 下的所有内容并使其成为自己的方法。假设你想要goto startInteraction,那么你可以这样做:

void startInteraction(){
    //everything below your "randomlabelhere:" would go in this method
}

然后在您想要触发它的任何时候致电startInteraction()

不同之处在于goto 不会返回到调用它的位置,而此方法会。如果您在调用startInteraction() 的行中使用return;,则可以模拟该功能,这样代码就不会继续跟随方法调用。

【讨论】:

    【解决方案4】:

    这是您可以做到的一种方法:

    import java.util.*;
    
    public class CasinoGames
    {
      public static void main(String[] args)
      {
        Scanner keys = new Scanner(System.in);
        sopln("Hello, and welcome to Casino Games!");
        sopln("Would you like to login, register, or play as a guest?");
        while (true) {
          char token = keys.nextLine().toLowerCase().charAt(0);
          if (token == 'l') {
            User.login();
            break;
          }
          else if (token == 'r') {
            User.register();
            break;
          }
          else if (token == 'g') {
            User.guestLogin();
            break;
          }
          else {
            sopln("Invalid Choice, please try again!");
          }
        }
      }
    }
    

    【讨论】:

    • 现在您将更正charString 之间的比较;)
    • 嘿,我看到你的评论时已经在我的预览窗口中了,所以我没有看到问题:)
    • 好吧,这里没有定义它们,因为它们是单独的类文件,我还没有构建 O.O.另外,我想指出,sopln 是我的 System.out.println 的伪代码,当我完成时我会全部替换来修复 ^_^
    【解决方案5】:
    import java.util.Scanner;
    
    public class Casino {
    
    public static void main(String[] args) {
        try (Scanner input = new Scanner(System.in)) {
            sopln("Hello, and welcome to Casino Games!");
            sopln("Would you like to login, register, or play as a guest?");
            while (true) {
                char token = input.next().toLowerCase().charAt(0);
                if (token == 'l') {
                    User.login();
                    break;
                } else if (token == 'r') {
                    User.register();
                    break;
                } else if (token == 'g') {
                    User.guestLogin();
                    break;
                } else {
                    sopln("Invalid Choice, please try again!");
                }
            }
        }
    }
    
    public static void sopln(String str) {
        System.out.println(str);
    }
    
    private static class User {
        static void login() {}
    
        static void register() {}
    
        static void guestLogin() {}
    }
    }
    

    Scanner 在 Java 7+ 中实现 AutoCloseable,因此我使用 try-with-resources 功能对其进行管理。

    注意:应该为用户提供一个菜单,以便他们知道 l、r 和 g 代表什么。我知道这似乎很明显,但你会感到惊讶:-P

    我还会添加某种转义案例来退出程序。

    我在想我上次使用 goto 语句是什么时候,唯一想到的就是 MIPS 程序集跳转操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2013-11-18
      • 1970-01-01
      • 2013-04-02
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多