StringBuilder和StringBuffer的不同类的一种方法

时间:2018-02-08 16:13:00

标签: java

我为每个类(StringBuffer和StringBuilder)提供了两个带有重复代码的方法

 public  void myStringBuffer() {
 StringBuffer sBuf=new StringBuffer("stringBuffer");
  //some code
 }

 public  void myStringBuilder() {
 StringBuilder sBuil=new StringBuilder("stringBuilder");
  //some code (same as in first method, duplicated)
 }

我想在方法中提取此代码,但我有不同的类

public someCode( Class<T> myStringObject)

这是关于泛型,但是怎么样?

UPD:是的,Generics什么都没有)) 谢谢你的回答。

3 个答案:

答案 0 :(得分:4)

他们都实现Appendable,所以只需将公共代码提取到方法中:

 public  void myStringBuffer() {
   common(new StringBuffer("stringBuffer"));
 }

 public  void myStringBuilder() {
   common(new StringBuilder("stringBuffer"));
 }

 private void common(Appendable appendable) {
   // some code.
 }

如果您需要其他已实现接口的方法,请使用交集类型:

<T extends CharSequence & Appendable> void common(T t) {
  // Some code.
}

答案 1 :(得分:2)

定义一个方法,将参数指定为一个变量,其类型允许调用这两个类所需的方法。 AbstractStringBuilderStringBuffer的直接超类StringBuilder将是一个非常好的候选者,但你不能使用它,因为它是包私有的。

因此,解决方法是使用Appendable 请注意,Appendable远非提供StringBuffer和StringBuilder提供的方法的多样性。 因此,这个解决方案可能还不够。

 public void myBuilder(Appendable  builder) {
  //some code
 }

并调用它:

 StringBuffer sBuf = new StringBuffer("stringBuffer");
 myBuilder(sBuf);

 StringBuilder sBuil = new StringBuilder("stringBuffer");
 myBuilder(sBuil);

答案 2 :(得分:0)

如果您的代码使用Appendable接口中声明的方法,则可以使用此声明:

public void yourMethod(Appendable value) {
    //your code
}

如果还需要CharSequence接口中的方法,则可能需要Object参数。为了确保获得正确的对象,您必须手动检查它们是否实现了正确的接口:

public void yourMethod(Object obj) throws Exception{
    if (!(obj instanceof Appendable)) {
        throw new Exception("Appendable interface not implemented by the received object"); //or a custom exception would be better
    } else if (!(obj instanceof CharSequence)) {
        throw new Exception("CharSequence interface not implemented by the received object");
    } else {
        Appendable app = (Appendable)obj; //use this one to use Appendable methods
        CharSequence chSeq = (CharSequence)obj; //use this one to use CharSequence methods

        //your code

        //e.g.
        app.append(" string to append");
        int totalLength = chSeq.length(); //would return the length of the resulting string
    }
}