2017-01-19 5 views
0

私は以下のコードを複製していますので、一度だけ書いておきたいと思います(Java 6でStringBufferとStringBuilderの統一コードを書く方法

)。
public class A { 
    public void doSomething(StringBuffer additional, int start, int end) { 
     try { 
      StringBuilder strBuilder = callMethodA(); 
      strBuilder.append(additional, start, end); 
      B.doSomething(strBuilder, additional, start, end);    
     } catch (Exception e) { 
      // do something 
     } 
    } 

    public void doSomething(StringBuilder additional, int start, int end) { 
     try { 
      StringBuilder strBuilder = callMethodA(); 
      strBuilder.append(additional, start, end); 
      B.doSomething(strBuilder, additional, start, end);    
     } catch (Exception e) { 
      // do something 
     } 
    } 
    ... 
} 

public class B { 
    public static void doSomething(StringBuilder strBuilder, 
        StringBuilder additional, int start, int end) { 
      // Do some code specific to "additional" StringBuilder 
      ... 
    } 

    public static void doSomething(StringBuilder strBuilder, 
        StringBuffer additional, int start, int end) {...} 
      // Do some code specific to "additional" StringBuffer 
      ... 
} 

あなたが見ることができるように、コードは「追加」パラメータがStringBuilderクラスAの第一の方法に及びStringBuffer秒であるという事実から除いて同じです。 重複を避けるためにコードを変更するにはどうすればよいですか? Bのロジックは、StringBufferStringBuilderのロジックが異なります。 AbstractStringBuilderは保護されたクラスなので使用できません。 私は、Java 6

感謝のStringBufferとStringBuilderのが関連していないと

+0

"クラスBのロジックは、StringBufferとStringBuilderで異なります。"どのように違うのですか? – Kayaman

+0

たとえば、StringBuilderの場合は新しいStringBuilderを作成し、StringBufferの場合は新しいStringBufferを作成したいとします。 –

+0

違いについて:http://stackoverflow.com/questions/355089/difference-between-stringbuilder-and-stringbuffer?rq=1 –

答えて

0

を使用しています、私は考えることができる唯一のソリューションは、このようなものになるだろう:

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()); 
} 
+0

ありがとうございます。しかし、私の場合は動作しません。 –

2

どのように追加可の使用について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関数をオーバーロードし、Appendable(またはObjectが必要な場合)をprivateにするdoSomething関数を作成します。

関連する問題