如何在java 6中编写StringBuffer和StringBuilder的统一代码
我有以下重复的代码,我只想写一次(请注意,这只是我想要实现的示例): 正如您所看到的,除了“附加的”参数在类如何在java 6中编写StringBuffer和StringBuilder的统一代码,java,stringbuilder,stringbuffer,Java,Stringbuilder,Stringbuffer,我有以下重复的代码,我只想写一次(请注意,这只是我想要实现的示例): 正如您所看到的,除了“附加的”参数在类AAStringBuilder的第一个方法和类StringBuffer的第二个方法中之外,代码是相同的。 如何修改代码以避免重复?类B中的逻辑对于StringBuffer和StringBuilder是不同的。 我不能使用AbstractStringBuilder,因为它是受保护的类。 我正在使用Java6 谢谢因为StringBuffer和StringBuilder不相关,我能想到的唯一解
A
AStringBuilder
的第一个方法和类StringBuffer
的第二个方法中之外,代码是相同的。
如何修改代码以避免重复?类B
中的逻辑对于StringBuffer
和StringBuilder
是不同的。
我不能使用AbstractStringBuilder
,因为它是受保护的类。
我正在使用Java6
谢谢因为StringBuffer和StringBuilder不相关,我能想到的唯一解决方案是这样的:
public void doSomething(StringBuffer additional, int start, int end) {
StringBuilder ad = new StringBuilder(additional);
doSomething(ad, start, end);
additional.replace(0, additional.length(), ad.toString());
}
由于StringBuffer和StringBuilder不相关,我能想到的唯一解决方案如下:
public void doSomething(StringBuffer additional, int start, int end) {
StringBuilder ad = new StringBuilder(additional);
doSomething(ad, start, end);
additional.replace(0, additional.length(), ad.toString());
}
使用Appendable接口接受A类中的StringBuilder和StringBuffer,然后使用instanceof检查B类中的类型如何。像这样:
public class A {
public void doSomething(Appendable additional, int start, int end) {
try {
StringBuilder strBuilder = callMethodA();
strBuilder.append(additional.toString(), start, end);
B.doSomething(strBuilder, additional, start, end);
} catch (Exception e) {
// do something
}
}
}
public class B {
public static void doSomething(StringBuilder strBuilder, Appendable additional, int start, int end) {
if (additional instanceof StringBuilder) {
// Do some code specific to "additional" StringBuilder
} else if (additional instanceof StringBuffer) {
// Do some code specific to "additional" StringBuffer
}
}
}
编辑:老实说,实际上并不需要可附加的接口,因为只应用了toString函数,它也可能只是一个对象。如果只希望在函数中接受StringBuilder和StringBuffers,可以重载doSomething函数,并使可附加(或对象,如果愿意)的doSomething函数成为私有的。如何使用可附加接口在A类中同时接受StringBuilder和StringBuffer,然后使用instanceof检查B类中的类型。像这样:
public class A {
public void doSomething(Appendable additional, int start, int end) {
try {
StringBuilder strBuilder = callMethodA();
strBuilder.append(additional.toString(), start, end);
B.doSomething(strBuilder, additional, start, end);
} catch (Exception e) {
// do something
}
}
}
public class B {
public static void doSomething(StringBuilder strBuilder, Appendable additional, int start, int end) {
if (additional instanceof StringBuilder) {
// Do some code specific to "additional" StringBuilder
} else if (additional instanceof StringBuffer) {
// Do some code specific to "additional" StringBuffer
}
}
}
编辑:老实说,实际上并不需要可附加的接口,因为只应用了toString函数,它也可能只是一个对象。如果只希望在函数中接受StringBuilders和StringBuffers,可以重载doSomething函数,并使可附加(或对象,如果愿意)的doSomething函数成为私有的。“StringBuffer和StringBuilder的B类逻辑不同。”它有什么不同?例如,如果我想在StringBuilder中创建一个新的StringBuilder,在StringBuffer中创建一个新的StringBuffer。对于差异:@RC。我指的是她的算法中的差异,它需要使用两个类,而且显然是必要的。@Kayaman oops我认为这是一个OP注释。如果OP真的(我的意思是真的)需要一个
StringBuffer
(我也怀疑),那么答案可能是一些包装器和一个公共接口“StringBuffer和StringBuilder的B类逻辑不同。”它有什么不同?例如,如果我想在StringBuilder中创建一个新的StringBuilder,在StringBuffer中创建一个新的StringBuffer。对于差异:@RC。我指的是她的算法中的差异,它需要使用两个类,而且显然是必要的。@Kayaman oops我认为这是一个OP注释。如果OP真的(我的意思是真的)需要一个StringBuffer
(我也怀疑这一点),那么答案可能是一些包装器和一个通用接口,但是由于我必须对每个包装器执行不同的操作,所以在我的情况下这不起作用。谢谢,但是因为我必须对每个包装器执行不同的操作,所以在我的情况下这不起作用。