PMD – Stringルール・セット


文字列に関するルールセットです。
※PMD 3.9に対応しています。

AvoidDuplicateLiterals

重複した文字列がないかチェックします。
チェック対象外とする重複文字列の最小値を指定する場合は
<property name=”threshold” value=”4″ />
を指定します。
デフォルト値は4です。

public class Foo
{
    private void bar()
    {
        buz("Howdy");
        buz("Howdy");
        buz("Howdy");
        buz("Howdy");
    }

    private void buz(String x)
    {
        // …
    }
} 

StringInstantiation

Stringオブジェクトを生成していないかチェックします。

public class Foo
{
    // String bar = "bar";とすべきです
    private String bar = new String("bar");
}

StringToString

Stringオブジェクトに対してtoString()を呼び出していないかチェックします。

public class Foo
{
    private String baz()
    {
        String bar = "howdy";

        // Stringオブジェクトに対してtoString()を呼び出しているのでNG!
        return bar.toString();
    }
}

InefficientStringBuffering

StringBufferのコンストラクタやappend()メソッドの中で+で文字列連結していないかチェックします。

public class Foo
{
    void bar()
    {
        // +で文字列連結しているのでNG!
        StringBuffer sb = new StringBuffer("tmp = " + System.getProperty("java.io.tmpdir"));

        // append()メソッドを使うべきです
        StringBuffer sb = new StringBuffer("tmp = ");
        sb.append(System.getProperty("java.io.tmpdir"));
    }
}

UnnecessaryCaseChange

不必要なtoUpperCase()、toLowerCase()がないかチェックします。
equalsIgnoreCase()を使用した方が効率がよいです。

public class Foo
{
    public boolean bar(String buz)
    {
        // buz.equalsIgnoreCase("baz")とすべきですのでNG!
        return buz.toUpperCase().equals("baz");

        // toUpperCase()が不必要ですのでNG!
        // return buz.toUpperCase().equalsIgnoreCase("baz");
    }
}

UseStringBufferLength

StringBufferの長さを求めるためにtoString()を使用しているものがないかチェックします。
StringBuffer.toString().equals(“”)やStringBuffer.toString().length() ==とするよりも
StringBuffer.length()を使うべきです。

public class Foo
{
    void bar()
    {
        StringBuffer sb = new StringBuffer();
        //これはよくない
        if (sb.toString().equals(""))
        {
            // …
        }

        // こっちの方がよい
        if (sb.length() == 0)
        {
            // …
        }
    }
}

AppendCharacterWithChar

StringBufferのappend()メソッドでcharをStringとして連結していないかチェックします。

public class Foo
{
    void bar()
    {
        StringBuffer sb = new StringBuffer();
        // Stringとして連結しているのでNG!
        sb.append("a");

        StringBuffer sb = new StringBuffer();
        // charとして連結すべきです
        sb.append('a');
    }
}

ConsecutiveLiteralAppends

何度も定数をappendしていないかチェックします。
チェック対象外とする回数の最小値を指定する場合は
<property name=”threshold” value=”1″ />
を指定します。
デフォルト値は1です。

public class Foo
{
    private void bar()
    {
        StringBuffer buf = new StringBuffer();
        // 何度もappendしているのでNG!
        buf.append("Hello").append(" ").append("World");

        // 1回にまとめるべきです
        buf.append("Hello World");
    }
}

UseIndexOfChar

indexOf()メソッドの引数に1文字の文字列が指定されていないかチェックします。
charの方が効率がよいです。

public class Foo
{
    void bar()
    {
        String s = "hello world";

        // これはよくない
        if (s.indexOf("d")
        {
            // …
        }

        // こっちの方がよい
        if (s.indexOf('d')
        {
            // …
        }
    }
}

InefficientEmptyStringCheck

String.trim().length()で文字列が空かどうかチェックしていないかチェックします。

public class Foo
{
    void bar(String string)
    {
        if (string != null && string.trim().size() > 0)
        {
            // …
        }
    }
}

InsufficientStringBufferDeclaration

StringBufferの生成時にメモリ領域が適切に確保されているかチェックします。
StringBufferはデフォルトで16文字の文字列バッファとして生成されます。

public class Foo
{
    void bar()
    {
        // 生成時に文字数を指定していないのでNG!
        StringBuffer bad = new StringBuffer();
        bad.append("This is a long string, will exceed the default 16 characters");

       // 生成時に文字数を指定しているのでOK!
        StringBuffer good = new StringBuffer(41);
        good.append("This is a long string, which is pre-sized");
    }
}

UselessStringValueOf

不必要なString.valueOf()がないかチェックします。

public String convert(int i)
{
    String s;
    // これはよくない
    s = "a" + String.valueOf(i);

    // こっちの方がよい
    s = "a" + i;

    return s;
}

StringBufferInstantiationWithChar

StringBufferのコンストラクタでcharを指定していないかチェックします。

class Foo
{
    // これはよくない
    StringBuffer sb1 = new StringBuffer('c');

    // こっちの方がよい
    StringBuffer sb2 = new StringBuffer("c");
}

関連記事

  1. コメント 0

  1. トラックバック 0

return top