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开始,使用
+
时会得到更好的效果(如前所述)。但是我喜欢在第二个变体中没有冗余的
可选调用。你甚至可以…