在Java中声明布尔变量的正确方式是什么?

18

我刚刚开始学习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时,要求我将其声明为false。
我尝试了以下代码,它似乎也能正常工作:

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声明为false。我在比较电子邮件地址之前必须声明isMatch为false的原因是什么?

6个回答

19

不仅没有必要先声明为false,我还会添加其他改进:

  • 使用boolean而不是Boolean(后者也可能无缘无故为null

  • 在声明时进行赋值:

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

    final boolean isMatch = email1.equals(email2);
    

最后但同样重要的一点:

if (isMatch == true)

可以表示为:

if (isMatch)

这使得isMatch标志不是很有用,将其嵌入可能不会影响可读性。我建议去寻找更好的课程/教程...


这是我第一次看到关键字“final”。我可能会在课程后期学习它。我现在还在学习一些非常基础的东西,这也许就是为什么我被要求以那种方式编写代码的原因,但由于我是Java的新手,在这个阶段我无法分辨对与错。不过还是谢谢你的建议。 - user1762031
引入“final”关键字可以提醒代码读者特定的项目在执行过程中不会改变,这对于编程非常有帮助。我也喜欢用if(isMatch)代替if(isMatch == true),因为这样更明显地表明了代码中的真/假分支。 - AndrewB

10

虽然不是必须的,但有些人喜欢显式初始化所有变量(我也是)。特别是那些在多种语言中编程的人,始终初始化您的变量比逐案例/逐语言决定更容易。

例如 Java 有布尔值、int 等的默认值.. 而 C 则不会自动赋初值,除非您自己明确地赋一个值,否则就会得到内存中现有的值。

在上面的情况下,正如您发现的那样,即使不进行初始化,代码也能正常工作,尤其是因为变量在下一行被设置,这使它看起来格外冗余。有时候,您可以将这两行(声明和初始化-如其他帖子所示)结合起来,采用最佳方法,即使用email1.equals(email2);操作的结果来初始化您的变量。


2
谢谢Levon的解释,让我能够轻松理解。我计划最终学习其他编程语言,所以我会遵循你的建议初始化我的变量,这样我就习惯了这样做。 - user1762031

2

没有必要这样做。实际上,我会选择将声明和初始化结合在一起,如下所示:

final Boolean isMatch = email1.equals (email2);

使用final关键字,这样你就不能再意外地修改它了。


1

首先,您不应该使用它们中的任何一个。您正在使用wrapper类型,这种情况下应该很少使用,除非您有一个原始类型。 因此,您应该使用boolean

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

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

但是,如果您立即分配给变量,则可以直接为其分配值,而无需定义default值。

因此,在您的情况下,我会像这样使用它:-

boolean isMatch = email1.equals (email2);

谢谢,我没有想到那样做。我用过int和String做过类似的事情,所以我应该想到它的。 - user1762031
@user1762031。是的。如果您查看Effective Java - Item#49,它清楚地指出要使用primitive而不是boxed primitive - Rohit Jain
谢谢Rohit。我会去看一下。 - user1762031

0
在你的例子中,你不需要这样做。作为标准的编程实践,在某些代码块内部引用的所有变量(比如try{} catch(){})并且在块外被引用时,你需要首先在try块之外声明变量,例如:

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

     boolean isMatch = false;

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

0

谢谢提供链接,我肯定会用得上的。 - user1762031

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接