【问题标题】:What is the correct way to declare a boolean variable in Java?在 Java 中声明布尔变量的正确方法是什么?
【发布时间】:2012-10-20 19:43:31
【问题描述】:

我刚刚开始学习 Java。在我关注的在线课程中,我被要求尝试以下代码:

String email1 = "meme@me.coh";
String email2 = "meme@me.com";
Boolean isMatch = false;

isMatch = email1.equals (email2);

if (isMatch == true){
    System.out.println("Emails match");
}
else{
    System.out.println("Emails don't match");
}

我不明白为什么在下一行我比较电子邮件地址并将值分配给isMatch 时,我被要求将isMatch 声明为假。
我已经尝试了以下代码,它似乎工作起来是一样的:

String email1 = "meme@me.coh";
String email2 = "meme@me.com";
Boolean isMatch;

isMatch = email1.equals (email2);

if (isMatch == true){
    System.out.println("Emails match");
}
else{
    System.out.println("Emails don't match");
}

在课程中,它没有解释为什么我首先声明isMatch 为假。在比较电子邮件地址之前,我必须将 isMatch 声明为 false 有什么原因吗?

【问题讨论】:

    标签: java variables boolean


    【解决方案1】:

    不仅不需要先声明为false,我还要添加一些其他改进:

    • 使用boolean而不是Boolean(也可以无缘无故地使用null

    • 在声明期间赋值:

      boolean isMatch = email1.equals(email2);
      
    • ...如果可以,请使用final 关键字:

      final boolean isMatch = email1.equals(email2);
      

    最后但并非最不重要的一点:

    if (isMatch == true)
    

    可以表示为:

    if (isMatch)
    

    这使得isMatch 标志没有那么有用,内联它可能不会损害可读性。我建议在那里寻找一些更好的课程/教程...

    【讨论】:

    • 那是我第一次看到关键字“final”。我可能会在课程的稍后部分进行讨论。我仍然在一些非常基本的东西上,这可能就是为什么我被要求以这种方式编写它,但是作为 Java 新手,我在这个阶段无法知道是非。不过感谢您的建议。
    • 引入“final”有助于提醒阅读代码的人,特定项目不会随着执行的继续而改变。我也喜欢用 if(isMatch) 替换 if(isMatch == true) 因为它更明显的是它在代码中的一个真/假分支
    【解决方案2】:

    您不必这样做,但有些人喜欢显式初始化所有变量(我也这样做)。尤其是那些使用多种语言编程的人,更容易拥有始终初始化变量的规则,而不是逐个案例/逐个语言决定。

    例如,Java 有 Boolean、int 等的默认值。另一方面,C 不会自动给出初始值,除非你自己明确地分配一个值,否则内存中发生的任何事情都是你最终得到的。

    正如您所发现的,在上述情况下,代码在没有初始化的情况下也能正常工作,尤其是因为变量设置在下一行,这使得它显得特别多余。有时您可以结合这两行(声明和初始化 - 如其他一些帖子所示)并充分利用这两种方法,即使用 email1.equals (email2); 操作的结果初始化您的变量。

    【讨论】:

    • 感谢 Levon 的解释,让我很容易理解。我计划最终学习其他语言,所以我会听从你的建议并初始化我的变量,以便我习惯这样做。
    【解决方案3】:

    没有理由这样做。事实上,我会选择将声明和初始化结合起来

    final Boolean isMatch = email1.equals (email2);
    

    使用 final 关键字,这样您以后也不能(意外)更改它。

    【讨论】:

      【解决方案4】:

      首先,您不应该使用它们。您正在使用 wrapper 类型,如果您有原始类型,则应很少使用该类型。 所以,你应该改用boolean

      此外,我们将 boolean 变量初始化为 false 以保存初始默认值,即 false。如果您已将其声明为实例变量,它将自动初始化为false

      但是,是否分配默认值完全取决于您。我宁愿在声明时初始化它们。

      但是如果你是立即给你的变量赋值,那么你可以直接给它赋值,而不必定义一个default值。

      所以,在你的情况下,我会这样使用它:-

      boolean isMatch = email1.equals (email2);
      

      【讨论】:

      • 谢谢,我没想过这样做。我已经用 int 和 String 做到了,所以我可能应该想到它。
      • @user1762031。是的。如果你看看Effective Java - Item#49。它明确声明使用primitive 而不是boxed primitive
      • 谢谢罗希特。我去看看。
      【解决方案5】:

      正如 Levon 所述,这不是文档中所述的强制要求: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

      这可能是其他不保证原始数据类型默认值的语言的习惯。

      【讨论】:

      • 感谢您的链接,我相信它会派上用场的。
      【解决方案6】:

      在您的示例中,您不需要。作为标准编程实践,所有变量都在某个代码块内引用,例如 try{} catch(){},并在外部引用块也是如此,您需要首先在 try 块之外声明变量,例如

      当你的 equals 方法调用抛出一些异常时,这很有帮助,例如NullPointerException;

           boolean isMatch = false;
      
           try{
               isMatch = email1.equals (email2);
            }catch(NullPointerException npe){
               .....
            }
            System.out.print("Match=="+isMatch);
            if(isMatch){
              ......
            }
      

      【讨论】:

        猜你喜欢
        • 2016-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        相关资源
        最近更新 更多