Java 如何使用stringBuilder
我有一个职能和技术负责人审查代码,并说: 为什么要这样说?这基本上是相同的信息。如果要自定义,请使用类型为的字符串生成器。 怎么改,有人能帮我吗Java 如何使用stringBuilder,java,string,optional,stringbuilder,stringbuffer,Java,String,Optional,Stringbuilder,Stringbuffer,我有一个职能和技术负责人审查代码,并说: 为什么要这样说?这基本上是相同的信息。如果要自定义,请使用类型为的字符串生成器。 怎么改,有人能帮我吗 private可选validatePrimaryPath(SalesChannelType salesChannelCode,List primaryPathList){ if(CollectionUtils.isEmpty(主路径列表)){ if(salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)
private可选validatePrimaryPath(SalesChannelType salesChannelCode,List primaryPathList){
if(CollectionUtils.isEmpty(主路径列表)){
if(salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)){
返回可选的.of(“客户层次结构是HebToYou的必填字段”);
}否则{
返回可选的.of(“客户层次结构是必填字段”);
}
}
返回可选的.empty();
}
为了防止多次写入同一(部分)字符串文字,您可以:
- 对公共零件使用常数:
if (CollectionUtils.isEmpty(primaryPathList)) { final String COMMON = "Customer Hierarchy is mandatory field"; if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) { return Optional.of(COMMON + " for HebToYou."); } else { return Optional.of(COMMON + "."); } }
- 使用
构建字符串:StringBuilder
if (CollectionUtils.isEmpty(primaryPathList)) { StringBuilder buf = new StringBuilder("Customer Hierarchy is mandatory field"); if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) { buf.append(" for HebToYou"); } return Optional.of(buf.append('.').toString()); }
就我个人而言,我会把代码保留在问题中,特别是如果您可能需要支持文本的非英语版本,因为在其他语言中,额外的文本可能不会出现在那里。首先,请不要使用原始类型。其次,我不同意使用
StringBuilder
构建消息是一种改进;然而,由于这是你想要的,我将向你展示可能的意图。大概
private Optional<String> validatePrimaryPath(SalesChannelType salesChannelCode,
List<String> primaryPathList) {
if (CollectionUtils.isEmpty(primaryPathList)) {
StringBuilder sb = new StringBuilder(
"Customer Hierarchy is mandatory field");
if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) {
sb.append(" for HebToYou");
}
sb.append(".");
return Optional.of(sb.toString());
}
return Optional.empty();
}
private可选validatePrimaryPath(SalesChannelType salesChannelCode,
列表(主路径列表){
if(CollectionUtils.isEmpty(主路径列表)){
StringBuilder sb=新的StringBuilder(
“客户层次结构是必填字段”);
if(salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)){
某人附加(“为HebToYou”);
}
某人加上(“.”);
返回可选的.of(sb.toString());
}
返回可选的.empty();
}
请注意,我已经指定了该方法,当您编写
Optional
和List
时,该方法返回一个Optional
,并获取一个列表,而不指定类型,那么您使用的是原始类型。,我认为您的代码还可以,但如果您仍然想使用StringBuilder
private Optional validatePrimaryPath(SalesChannelType salesChannelCode, List primaryPathList) {
if (CollectionUtils.isEmpty(primaryPathList)) {
StringBuilder sb = new StringBuilder("Customer Hierarchy is mandatory field.");
if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) {
sb.insert(sb.length()-1, " for HebToYou");
}
return Optional.of(sb.toString());
}
return Optional.empty();
}
指定两个字符串文本意味着没有运行时开销。当所有参数都是编译时常量时,可以使用字符串连接实现同样的效果。相反,使用StringBuilder
总是意味着运行时操作。您可以阅读中有关“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));
}
private可选validatePrimaryPath(
SalesChannelType salesChannelCode,列表主路径列表){
final String prefix=“客户层次结构是必填字段”;
最后一个字符串general=前缀+”,forHebToYou=前缀+“forHebToYou。”;
返回可选的.of(
salesChannelCode.equals(SalesChannelType.HEB_TO_____________________________
.filter->CollectionUtils.isEmpty(主路径列表));
}
这强调了您也在做同样的事情,只是使用了稍微不同的数据,并使用了Optional
的语义,而不是if
语句。如果您决定将实际字符串外部化,那么实际代码不需要更改
请注意,如果SalesChannelType
是一个enum
,那么就不需要equals
,您可以直接使用salesChannelCode==SalesChannelType.HEB___
。我不会为此使用StringBuilder
,或者我遗漏了什么?我更关心原始类型。我也不会在这里使用StringBuilder
。我不明白为什么要在这里使用StringBuilder,以及如何使用它。我同意@trarry Wombat。您可以使用单个可选的.of并通过三元运算符有条件地附加“for HebToYou”。只是想一想……即使不使用编译时常量,我也不会使用StringBuilder
,因为它会使代码复杂化,而不会带来任何好处。在Java 8之前的所有Java版本中,使用+
时都会得到这段代码,而从Java 9开始,使用+
时会得到更好的效果(如前所述)。但是我喜欢在第二个变体中没有冗余的可选调用。你甚至可以…