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 で自動生成するので、こんなこと気にする人はいないと思いますが・・