gpt4 book ai didi

java - 条件(三元)运算符的多项选择等效?

转载 作者:行者123 更新时间:2023-11-29 07:38:42 29 4
gpt4 key购买 nike

<分区>

我有让我的 Java 代码更简洁的一面。当然,这是有原因的:我在一个屏幕上看到的越多,就越容易遵循逻辑。

例如,在赋值时,可以这样写:

String result;
if (arg != null) {
result = arg.toString();
} else {
result = "default";
}

当然这要短得多:

String result = (arg != null) ? arg.toString() : "default";

然而,对于非 boolean 条件(即,超过 2 个选择),人们仍然坚持使用 switch 语句,例如:

SimpleDateFormat format;
switch (dateOrder) {
case DMY :
format = new SimpleDateFormat("{2}" + sep + "{1}" + sep + "{0}");
break;
case MDY :
format = new SimpleDateFormat("{1}" + sep + "{2}" + sep + "{0}");
break;
case YMD :
format = new SimpleDateFormat("{0}" + sep + "{1}" + sep + "{2}");
break;
default :
format = null;
}

我想出了一个实用程序类,它使用泛型、lambda 和链接范式来提供如下语法:

SimpleDateFormat format = Multary.<DateOrderEnum, SimpleDateFormat>nSwitch(dateOrder)
.nCase(DateOrderEnum.DMY, () -> new SimpleDateFormat("{2}" + sep + "{1}" + sep + "{0}"))
.nCase(DateOrderEnum.MDY, () -> new SimpleDateFormat("{1}" + sep + "{2}" + sep + "{0}"))
.nCase(DateOrderEnum.YMD, () -> new SimpleDateFormat("{0}" + sep + "{1}" + sep + "{2}"))
.nDefault(() -> null)
.result();

(该类本身很容易实现,所以我不会让读者厌烦那些代码。)

我的问题是:

  1. 我是在重新发明轮子吗?从搜索结果来看,我不是唯一一个渴望抓挠的人。以前做过类似的事情吗?
  2. 这有什么缺点吗?我能想到的一些包括:
    • 可能效率低下,因为在内部使用 Map 而不是语言结构;
    • 没有编译器警告警告未使用的常量(在 switchenum 的情况下)- 问题(包括“没有合适的情况以及没有提供默认情况”)只能在运行时检测到,并抛出合适的异常;
    • 也没有编译器检查重复常量或多个默认值——最近的调用将是确定的。这只能在运行时再次检查(抛出合适的异常);
    • 放弃 case 语句的“fall through”功能 - 每个 nCase() 调用只使用一个常量(尽管这可能是改进了一些更多的代码……这可能会使语法更加困惑);
    • 代码自动格式化可能将链式命令搞得一团糟,造成不可读的困惑,因此需要小心设置以使其令人满意。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com