【问题标题】:Default Boolean value in Java [duplicate]Java中的默认布尔值[重复]
【发布时间】:2014-02-25 20:44:33
【问题描述】:

我只是想知道Java中是否有区别:

private boolean someValue;

private boolean someValue = false;

第二行可能只是浪费时间?

编辑(摘要):

从答案我发现几乎没有区别,但是:

“然而,依赖这样的默认值通常被认为是糟糕的编程风格。”

但有一些强烈的论据不这样做 - 请参阅下面接受的答案。

编辑 2

我发现在某些情况下boolean必须初始化,否则代码将无法编译

boolean someValue;
if (someValue) { // Error here
     // Do something
}

在我的 NetBeans IDE 中出现错误 - “变量 someValue 可能尚未初始化”

越来越有趣了.. :)

【问题讨论】:

  • 其实有细微的差别,但最终的结果是一样的。一般来说,你应该更喜欢第一个。
  • @morgano:如果另一个开发人员不知道默认值,那么他最终会学习并了解它们。这是必须知道的。
  • @JBNizet 在理想的世界里,每个人都应该是专业的,知道自己在做什么;不幸的是,我们生活在地球上,这不会发生,拥抱它!
  • 无所不知也没有问题。拒绝学习是有问题的。得知 Java 字段具有明确定义的默认值有什么问题?根据您的推理,您还应该添加注释“这将 false 分配给变量 someValue”,以防开发人员并不真正了解分配是什么。如果代码依赖于诸如a += j++ - --b 之类的晦涩规则,我会同意您的看法,但默认值不在此级别。
  • 这是一个好问题,值得重新讨论。在 Java 中,booleanBoolean 是非常不同的野兽;标记重复的人可能没有意识到这一点。不幸的是,他们对一个他们没有充分研究的主题进行了投票。

标签: java boolean


【解决方案1】:

Java 中的所有实例和类变量都使用default value 进行初始化:

对于boolean 类型,默认值为false

所以您的两个语句在功能上是等效的在单线程应用程序中

但请注意,boolean b = false; 将导致两次写入操作:b 首先将被分配其默认值 false,然后将被分配其初始值(恰好也是 false)。这在多线程上下文中可能很重要。请参阅this example,了解显式设置默认值如何引入数据竞争。

然而,依赖这样的默认值通常被认为是糟糕的编程风格。

我的观点恰恰相反:显式设置默认值是不好的做法:

  • 它引入了不必要的混乱
  • 它可能会引入微妙的并发问题

【讨论】:

  • 是的,我同意,虽然官方文件相反...
  • 为了可读性,最好总是设置一个值。还要考虑以下几点:如果您使用 Boolean 而不是 boolean,则默认值为 null。
  • @Hannes 最后,没有明确的答案:两者都是有效的陈述,所以使用哪个是品味和意见的问题......我们正在谈论设置默认值 - 如果你愿意一个布尔值是假的,那么你当然应该把它设置为假。
  • @assylias 完全正确。但是与后辈一起工作,您很快就会忘记品味。您只想尽量减少错误。 “不要让我思考”
  • 我同意——我讨厌代码混乱。如果您编写的代码复制了编译器已经完成的工作,我开始怀疑您是否了解您的语言。另一方面,如果您确实依赖编译器,那么您最好是对的。如果您在实际需要时设置默认值(局部变量),那么我知道我们有问题。
【解决方案2】:

如果你没有初始化它,它将是false。所以它们之间没有区别。

【讨论】:

    【解决方案3】:

    boolean数据类型的默认值是false所以我们可以说没有区别。

    【讨论】:

    • @Patrick Hofman 谢谢。
    【解决方案4】:

    没有区别,来自:

    http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

    声明字段时并不总是需要赋值。 已声明但未初始化的字段将设置为 编译器的合理默认值。一般来说,这个默认 将为零或空,具体取决于数据类型。依靠这样的 然而,默认值通常被认为是糟糕的编程 风格。

    【讨论】:

    • 嗯.. 有趣的注意事项:然而,依赖这样的默认值通常被认为是不好的编程风格。
    • 我认为这意味着您应该在某个阶段初始化变量,然后再使用它们。这主要是在构造函数中完成的,java 编译器对 someValue 的目的一无所知,但它有助于您将其设置为已知的可预测值 false。
    【解决方案5】:

    如果您声明为原语,即boolean。如果它是实例变量(或类变量),则默认值为 false

    如果它是一个实例变量Boolean,它将是null

    如果它是在方法中声明的,则必须对其进行初始化,否则会出现编译器错误。

    【讨论】:

      猜你喜欢
      • 2018-08-14
      • 2011-08-28
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2011-12-13
      相关资源
      最近更新 更多