【问题标题】:Conditional operator in if-statement?if语句中的条件运算符?
【发布时间】:2011-02-18 21:24:18
【问题描述】:

我用 Java 编写了以下if-statement:

if(methodName.equals("set" + this.name) ||
    isBoolean() ? methodName.equals("is" + this.name) :
                  methodName.equals("get" + this.name)) {
    ...
}

if 中编写此类表达式以将状态与条件分开是一种好习惯吗?这个表达式可以简化吗?

【问题讨论】:

  • 您知道现有的 Javabean 映射工具吗?有很多 :)
  • 我没有什么特别重要的贡献,但即使作为一个喜欢三元运算符的人,我也必须注意,有些人坚信应该很少使用它。那些人可能会对你的用法嗤之以鼻。
  • @BalusC:对我的 JavaBean 活动的猜测。我只是为了爱好和个人使用而实现它,在每个 setter 中只通过 super.property(newValue) 清理 Beans 内的语法。 ;-) 但我知道他们,谢谢提及。
  • 爱好总是好的 :) 当您意识到类似且广泛使用的第 3 方 API 已经完成了非常出色的工作时,不要害怕;)
  • 没有人会指出 conditional 运算符恰好是 Java 中唯一的 ternary 运算符???

标签: java if-statement conditional-operator


【解决方案1】:

我倾向于将其更改为

if (methodName.equals(setterForThis())
   || methodName.equals(getterForThis())) {
    ...
}

提取了一些函数:

private String setterForThis() {
   return "set" + this.name;
}

private String getterForThis() {
   return (isBoolean() ? "is" : "get") + this.name;
}

当然是更长的时间,但无论如何我并不是很喜欢打高尔夫球。

【讨论】:

    【解决方案2】:

    不会像下面这样工作吗?

    if (methodName.equals("set" + this.name)
        || methodName.equals("get" + this.name)
        || (isBoolean() && methodName.equals("is" + this.name))) {
        ...
    }
    

    它比您使用三元运算符的方式更具可读性,当然也更容易理解。它还有一个优点是它可以避免对 isBoolean 方法的不必要的方法调用(它有 1、2 或 4 个方法调用,而你的总是有 1 或 3 个;性能增益/损失可能太小以至于无法注意到)。

    这里还有一个类似的问题,标题为"Is this a reasonable use of the ternary operator?" 一位用户有the following to say

    三元运算符旨在 返回一个值。

    IMO,它不应该改变状态,并且 应该使用返回值。

    在另一种情况下,使用 if 语句。 如果语句旨在执行 代码块。

    请注意,为了便于阅读,我在包含“&&”的表达式周围加上了括号。它们不是必需的,因为在 m || n 之前评估了 x && y

    您是否选择使用它取决于您,但我倾向于避免使用它以提高可读性。

    【讨论】:

    • 您的重写非常实用,因为“getSomeBooleanProperty”方法也会通过。不过,它的可读性不如 SLaks(主观)。
    【解决方案3】:

    这是好的做法吗?如果它使阅读更容易,那就太好了。如果 (1) 确实如此,并且 (2) 会被它弄糊涂的人不会阅读它,那么它会更容易阅读。谁来读它?

    【讨论】:

      【解决方案4】:

      我会改成

      if (methodName.equals("set" + this.name)
       || methodName.equals( (isBoolean() ? "is" : "get") + this.name)) {
          ...
      }
      

      【讨论】:

      • 我会删除多余的this.'s
      • @Software Monkey:这是我的代码风格,如果打扰到您,我很抱歉。
      • @Pindatjuh:很公平——我说的是“我愿意”,而不是“你应该”。各有各的。它不打扰我,只是额外的打字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2015-02-08
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多