java - 如何使用字符串生成器
问题描述
我有一个功能和技术负责人审查代码并说:为什么这个if语句?这基本上是相同的消息。如果要自定义,请使用带有类型的字符串生成器。如何更改它,有人可以帮助我吗?
private Optional<String> validatePrimaryPath(SalesChannelType salesChannelCode, List<String> primaryPathList) {
if (CollectionUtils.isEmpty(primaryPathList)) {
if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) {
return Optional.of("Customer Hierarchy is mandatory field for HebToYou.");
} else {
return Optional.of("Customer Hierarchy is mandatory field.");
}
}
return Optional.empty();
}
解决方案
指定两个字符串文字意味着没有运行时开销。当所有参数都是编译时常量时,您可以使用字符串连接来实现相同的目的。相反,使用StringBuilder
always 意味着运行时操作。您可以在此答案中阅读有关“<code>StringBuilder 比+
神话更好”的更多信息。
您通常可以降低代码的语法复杂性:
private Optional<String> validatePrimaryPath(
SalesChannelType salesChannelCode, List<String> primaryPathList) {
final String prefix = "Customer Hierarchy is mandatory field";
final String general = prefix + ".", forHebToYou = prefix + " for HebToYou.";
return Optional.of(
salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)? forHebToYou: general)
.filter(s -> CollectionUtils.isEmpty(primaryPathList));
}
这强调您正在做同样的事情,只是数据略有不同,并使用语义Optional
而不是if
语句。如果您决定将实际字符串外部化,则实际代码不需要更改。
请注意,如果SalesChannelType
是enum
,则不需要equals
,您可以使用salesChannelCode == SalesChannelType.HEB_TO_YOU
then 。
推荐阅读
- javascript - 通过使用 onBeforeCompile 扩展 three.js Material 类将颜色渐变应用于材质
- php - 登录页面未登录用户
- c# - 拒绝访问请求的资源 403 SP-API AMAZON - C#
- r - 如何从文件中提取数值数据并在 R 中创建数据框
- sql - SQL XML 成员是否区分大小写?
- mysql - 在一个命令上运行多个查询
- python - 如何使用函数返回的列表,作为 Python 中的函数参数
- javascript - 将 StackNavigator 添加到我的应用程序项目中,但我无法使其与我拥有的类一起使用
- alexa-skills-kit - 如何在 Slot 中收集多个值?
- linux - Bluez HID over GATT