[英]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
語句。 如果您決定外部化實際字符串,則實際代碼不需要更改。
請注意,如果SalesChannelType
是enum
,則不需要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();
}
請注意,當您編寫Optional
和List
而不指定類型時,我已指定該方法返回一個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.