如何“优化”对象创建 IF

问题描述 投票:0回答:2

我有时会有这些工作流程。

MyObj mo = null;
if (x == 1)
{
  mo = foo ();
}
else if (x == 2)
{
  ...
}
else
{
  mo = bar ();
}

我认为它不是很“漂亮”,并且有一个逻辑可能性(有更多的 if,也许没有其他)该对象将是未定义的。我必须处理好这个问题。

有什么办法可以让它变得更优雅吗?我认为对于如此简单的代码来说它相当长。

我不确定 case 语句或三元 if 是否会更好......

java
2个回答
0
投票

首先,如果要确保所有条件分支都赋值,只能在第一行声明一个final变量。这样,编译器就知道您的变量必须只分配一次,并且它可以检查 if/else 是否详尽:

final String myVar;
if (x == 0) myVar = "zero";
else if (x > 0) myVar = "positive";
else myVar = "negative";

此外,从 java 14 开始,您可以使用 switch statements 代替。它是一种特殊类型的开关,返回一个变量,由其一个分支分配(分支是互斥的)。

关于 switch 表达式的一些注意事项:

  • 不能使用复杂的条件,只能进行简单的值比较。
  • 如果测试的变量是枚举值,即使没有
    default
    分支,您也可以使其详尽无遗,因为编译器随后能够检查是否已在 switch 中测试了所有可能的值。

示例:

final String myVar = switch (x) {
    case 0 -> "zero"
    case 1 -> "one"
    default -> "other"
};

0
投票

您使用的 Java 版本是什么?如果您使用 JDK 14+,则可以使用

switch expressions

var x = 1;
Object mo = switch (x) {
    case 1 -> new Object();
    default -> new Object();
};
System.out.println(mo);

该对象将是未定义的。我必须处理好这个问题。

使用此语法,如果编译器检测到未处理所有情况,则需要

default
情况。否则你会得到错误
The switch expression does not cover all possible input values

如果您处理了所有可能的值,则不需要

default

enum Type {
  FOO,
  BAR
}

var t = Type.FOO;
Object mo = switch (t) {
    case FOO -> "f";
    case BAR -> "b";
};

如果有一天您在枚举中添加一个值,您将需要修改代码来处理这个问题,这很好。

© www.soinside.com 2019 - 2024. All rights reserved.