2011-08-03 7 views
1

私のような、自動化されたメッセージでtoString()をオーバーライドします抽象クラスをdevicingています:のような生成のtoString()テキスト

public abstract class AbstractTask { 

    abstract void run(); 
    abstract int calculate(); 

    private String makeMessage() { 
     String raw = this.getClass().toString(); 
     // do regex stuff here! 
    } 

    @Override 
    public String toString() { 
     return makeMessage(); 
} 

私の実装クラスと呼ばれるかもしれない(AbstractTaskが延びて)何かを

TaskXRQMinimize 
TaskListParallell 
TaskVerifyRepositoryEmpty 
TaskCreateXRQs 
TaskCreateZRQs 
TaskSendAllSRQToTLS 

クラスのtoString()メソッドがあり呼び出すときに私が欲しい出力は持っている:

Task XRQ Minimize 
Task List Parallell 
Task Verify Repository Empty 
Task Create XRQs 
Task Create ZRQs 
Task Send All SRQ To TLS 

([A-Z]{1}[a-z]+|[A-Z]{3}[a-z]?) 

どのように私はこれを実装します:

は、私はこれらの単語を見つけるために、単純な正規表現パターンを作ったのですか?

+0

あなたはXRQ、SRQ、TLSを探したいですか? – Leon

答えて

3

抽象も同様にして、サブクラスが固定ストリングを返すことによってそれを実装するように強制します。クラス名の解析を破棄し、正規表現を使用する - 脆弱でパフォーマンスが低い。 が本当になら、毎回toString()が呼び出されるのではなく、少なくとも1回クラスごとに計算を行います。

正規表現については、私はもっと良いものがあります:Apache Commons LangからStringUtils#splitByCharacterTypeCamelCase()(いくつかのものを再発明する必要は本当にありません):お使いの場合には

StringUtils.splitByCharacterTypeCamelCase("fooBar")  = ["foo", "Bar"] 
StringUtils.splitByCharacterTypeCamelCase("foo200Bar") = ["foo", "200", "Bar"] 
StringUtils.splitByCharacterTypeCamelCase("ASFRules") = ["ASF", "Rules"] 

//yields [Task, Send, All, SRQ, To, TLS] 
StringUtils.splitByCharacterTypeCamelCase("TaskSendAllSRQToTLS") 
+0

ニース!私はちょうど新しい単語を学びました: "キャメルケース" =) – Theodor

0

を私は考えクラスの名前を反復し、新しいStringを作成してください。ルールはかなりシンプルです:現在の文字が大文字で、次が小文字の場合、現在の文字の前にスペースを挿入する必要があります。

+0

あなたはSRQとTLSのような逸脱を忘れています!特に複数のもの、すなわちXRQ。 – Theodor

+0

複数のものを除いて、abrevationsで動作します。私はそれを気付かなかった、申し訳ありません。とにかく、私はTomaszに同意します、これは良い習慣ではありません。 –

+0

あなたは正規表現がそのような単純な問題の悪い習慣であるかもしれないということは正しいです。 – Theodor

1

私はこれを試していないが、それは合理的に見える

str.replaceAll("(\\w)([A-Z]\\w)", "$1 $2")のようなものを使用する必要があります。 aBcのようなすべてのシーケンスを "a Bc"に置き換えます。

+0

クール!いくつかのtweeksでうまくいくように見えますが、 "$ 1 $ 2"のことを説明できますか? – Theodor

1

これは正しい軌道に乗ってあなたを置く必要があります:あなたが抽出したい正規表現の

部品、()で囲みます。

String raw = "TaskXRQMinimize"; 
    String regexp = "([A-Z]{1}[a-z]+)([A-Z]{3})[a-z]?"; 
    Pattern pattern = Pattern.compile(regexp); 

    Matcher matcher = pattern.matcher(raw); 
    if (matcher.find()) 
    { 
     System.out.println("AFSDgaf " + matcher.groupCount()); 
     System.out.println("afdgafd " + matcher.group(1)); 
     System.out.println("afdgafd " + matcher.group(2)); 
    } 
関連する問題