簡體   English   中英

如何使用字符串生成器

[英]How to use stringBuilder

我有一個功能和技術負責人審查代碼並說:為什么這個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總是意味着運行時操作。 您可以在此答案中閱讀有關“ 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語句。 如果您決定外部化實際字符串,則實際代碼不需要更改。

請注意,如果SalesChannelTypeenum ,則不需要equals ,您可以使用salesChannelCode == SalesChannelType.HEB_TO_YOU然后。

為了防止多次寫入相同的(部分)字符串文字,您可以:

  • 對公共部分使用常量:

     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();
}

請注意,當您編寫OptionalList而不指定類型時,我已指定該方法返回一個Optional<String>並采用List<String> ,然后您使用的是原始類型。

就個人而言,我認為您的代碼沒問題,但如果您仍想使用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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM