JavaBeansのプロパティ名とGetter/Setter名

JavaBeansのプロパティ名とGetter/Setter名の対応について、何となくは知っていたがきちんと調べてたことがなかったので調べてみた。

The JavaBeans 1.01 specification

まずプロパティ名からGetter/Setter名を生成する際のルールについて。これは「8.3 Design Patterns for Properties」に書かれている。"<propertyName>"という名前のプロパティのGetter/Setterは"get<PropertyName>()"と"set<PropertyName>(<PropertyType>)"とのことなので、プロパティ名の最初の1文字を大文字にしたものの頭に"get"または"set"を連結したものがGetter/Setterの名前になる。

ただし型がbooleanであるプロパティについてはGetterとして"is<PropertyName>()"というメソッドでも良いことになっている。"is〜"と"get〜"が両方ある場合は"is〜"が優先される。

次に先頭が大文字で始まる文字列からプロパティ名を生成する際のルールについて。これは「8.8 Capitalization of inferred names.」に書かれている。ルールは2つ。

  • 最初の2文字が大文字ならそのまま。
  • そうでないなら最初の1文字を小文字にする。

ちなみに「A」などの1文字だけからなる文字列については、2文字目がないので「最初の2文字が大文字」ではない。従って2番目のルールが適用されてプロパティ名は「a」となる。

ちなみにルールがこのようになっているのは、例えば「URL」等のプロパティ名が「uRL」になってしまうのが違和感があるかららしいが、この特例のおかげでプロパティ名とGetter/Setter名の変換に対称性がなくなってしまっている。すなわち、「aName」というプロパティのGetter名は「getAName」だが、「getAName」から接頭辞「get」を外した文字列「AName」からプロパティ名を生成すると「AName」となってしまい、元の「aName」ではなくなってしまう。

従って、先頭1文字目が小文字で2文字目が大文字のプロパティ名は使わない方が無難かもしれない。