我在重构时偶然发现了一段奇怪的代码。它看起来像是分解两个 readString() 方法的共同部分的候选者,只是它似乎是不可能的(这对我来说是一个疯狂的脑筋急转弯):
private final StringBuilder readStringBuilder = new StringBuilder(128);
@Override
public String readString() throws IOException {
final int l = readInt();
if (l <= 0) {
switch (l) {
case -1: return null;
case 0: return "";
default: throw new IOException("invalid string length encoding: " + l);
}
}
readStringBuilder.setLength(0);
for (int i=0; i<l; ++i) {
readStringBuilder.append(readChar());
}
return readStringBuilder.toString();
}
@Override
public String readString(final StringCache cache) throws IOException {
final int l = readInt();
if (l <= 0) {
switch (l) {
case -1: return null;
case 0: return "";
default: throw new IOException("invalid string length encoding: " + l);
}
}
readStringBuilder.setLength(0);
for (int i=0; i<l; ++i) {
readStringBuilder.append(readChar());
}
return cache.get(readStringBuilder, readStringBuilder);
}
您会看到这两个方法的作用几乎相同,方法主体完全相同,除了 return 语句。但是由于有提前终止退出,我找不到可以采用主体的方法签名 - 自然地,返回类型将是 StringBuilder,只有在提前终止的情况下才会是 String ...
任何想法如何将身体分解成一个单独的方法?(请注意,空 StringBuilder 上的 toString() 确实会创建一个新字符串,而不是返回一个常量字符串文字)
编辑: StringCache 的定义是:
public interface StringCache {
public String get(final CharSequence charSeq, final CharSequence notFoundResult);
}