【问题标题】:Java declare variable in ternary operation. Is it possible?Java 在三元运算中声明变量。可能吗?
【发布时间】:2016-03-16 13:29:24
【问题描述】:

假设我们有一些 cityString getZIP() 方法。 如果 ZIP 为空,我想打印 ZIP 的值或不打印任何内容。

我可以在一行代码中用三元运算完成:

System.out.print(city.getZIP() == null ? "" : city.getZIP())

问题是:我可以在不调用.getZIP() 两次的情况下做同样的事情吗? 比如:

System.out.print(String zip = city.getZIP() == null ? "" : zip) //syntax error here

【问题讨论】:

  • 那么 zip 将只存在于该范围内,这意味着它在您的其余代码中无用
  • 你也可以在 print 调用之前创建变量并检查这个变量吗?
  • @Sloth 你为什么要这样做
  • @BalajiKrishnan 我正在寻找一种在一行代码中实现它的方法,而无需在三元运算之外创建额外的局部变量,也无需两次调用该方法。
  • 您将如何从中受益。要么调用 getter 两次,要么得到一个额外的局部变量。我没有看到任何好处

标签: java ternary-operator


【解决方案1】:

您可以将值分配给现有变量,但不能在三元条件内创建一个。

类似的,

String zip; // Created elsewhere but not assigned to city.getZip().
System.out.print(((zip = city.getZIP()) == null) ? "" : zip)

但是你不能在里面声明一个新变量。

【讨论】:

    【解决方案2】:

    在单独的行中定义变量:

    String zip = city.getZIP();
    System.out.print(zip == null ? "" : zip);
    

    【讨论】:

    • 我知道这种方式,但我想问是否存在单线解决方案。
    • 请阅读我的问题。我不是在寻找某个问题的解决方案。
    • @Sloth:那你在寻找什么?如果没有问题,您为什么要尝试创建一个?
    • @Sloth:这个答案中的代码正是这样做的。对于"can I do the same without calling .getZIP() twice?"的提问,这就是答案。目前尚不清楚您还想完成什么。
    • @Sloth:如果getZip() 操作代价高昂,请将结果在内部缓存到city 对象,因此两次调用该方法不会产生相同的两次代价。否则,将结果存储在对象外部的变量中。 (一种称为提取变量的重构模式:refactoring.com/catalog/extractVariable.html)这种“存储结果而不必存储结果”的追求似乎是徒劳的。
    【解决方案3】:

    我有一个完全不同的解决方案:不要这样做

    不要将返回 null 作为“合法”结果的方法放在您的类中。

    例如:邮政编码可以/应该是它自己的类。然后您只需声明一些 ZIP 的单例实例来表示“邮政编码未定义”。然后在 "UnknownZip" 上调用 toString ...例如只给出一个空字符串。

    使用 null 作为返回值总是会为 NullPointerExceptions 带来机会。

    所以 - 不要那样做。

    【讨论】:

    • 具体来说,这是一种称为 Introduce Null Object 的重构模式:refactoring.com/catalog/introduceNullObject.html
    • 请阅读问题
    • 我读了你的问题;我只是建议你忘记微妙的语法问题,而是专注于你的问题背后更重要的设计问题。
    • 您并不总是 100% 的代码生产者,您可能是客户,在这种情况下,我认为 Java 错过了一些东西,看看这 String title = info.getTitle() == null ? "" : ("Title= " + info.getTitle()); 有多可怕,而您却做不到否则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多