読者です 読者をやめる 読者になる 読者になる

Boolean のアクセッサーに isXXX は有りか?

Java

Java 5 になってオートボクシングが使えるようになり、以下のようにプリミティブラッパーがプリミティブ型と同じように扱えるようになりました。

    Boolean b = true;
    if (b == true) {
        System.out.println("true");
    }


では、Boolean をフィールドとして持つ Bean は通常以下のように定義されますが、

public class Bean {
    private String name;
    private Boolean checked;

    public Boolean isChecked() { return checked; }
    public void setChecked(Boolean checked) { this.checked = checked; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

getter をプリミティブの boolean と同じように、以下の定義としても良いでしょうか?

    public Boolean isChecked() { return checked; }

null を返却する可能性のあるメソッドに isXXX は普通つけませんが、以下の理由で明確に避けるべきです。


先のBeanを Introspector にてBeanの情報を見てみます。

        BeanInfo beanInfo = Introspector.getBeanInfo(Bean.class, Object.class);
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for(PropertyDescriptor pd : pds) {
            System.out.println("------");
            System.out.println("Property Name:" + pd.getName());
            System.out.println("ReadMethod   :" + pd.getReadMethod());
            System.out.println("WriteMethod  :" + pd.getWriteMethod());
        }


このコードの出力結果は、以下のようになります。

------
Property Name:checked
ReadMethod   :null
WriteMethod  :public void etc9.Bean.setChecked(java.lang.Boolean)
------
Property Name:name
ReadMethod   :public java.lang.String etc9.Bean.getName()
WriteMethod  :public void etc9.Bean.setName(java.lang.String)

isChecked() メソッドが ReadMethod として認識されません。Introspector にてBeanを扱うライブラリは多く存在するため、間違っても Boolean に isXXX のような名前を付けるべきではありません。


ちなみに、PropertyDescriptor.getReadMethod() 内部で以下のようにしているためです。

        if (type == boolean.class || type == null) {
            readMethodName = "is" + getBaseName();
        } else {
            readMethodName = "get" + getBaseName();
        }


まぁ、普通 getter/setter は IDE で自動生成するので、こんなこと気にする人はいないと思いますが・・