如何在java 6中编写StringBuffer和StringBuilder的统一代码

如何在java 6中编写StringBuffer和StringBuilder的统一代码,java,stringbuilder,stringbuffer,Java,Stringbuilder,Stringbuffer,我有以下重复的代码,我只想写一次(请注意,这只是我想要实现的示例): 正如您所看到的,除了“附加的”参数在类AAStringBuilder的第一个方法和类StringBuffer的第二个方法中之外,代码是相同的。 如何修改代码以避免重复?类B中的逻辑对于StringBuffer和StringBuilder是不同的。 我不能使用AbstractStringBuilder,因为它是受保护的类。 我正在使用Java6 谢谢因为StringBuffer和StringBuilder不相关,我能想到的唯一解

我有以下重复的代码,我只想写一次(请注意,这只是我想要实现的示例):

正如您所看到的,除了“附加的”参数在类
A
A
StringBuilder
的第一个方法和类
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
(我也怀疑这一点),那么答案可能是一些包装器和一个通用接口,但是由于我必须对每个包装器执行不同的操作,所以在我的情况下这不起作用。谢谢,但是因为我必须对每个包装器执行不同的操作,所以在我的情况下这不起作用。