というgetter/setterメソッドがあれば、fooというプロパティが定義されていると解釈します。ここからは、メソッドの中では、先頭が大文字ですが、プロパティ名としては、先頭を小文字に変換するという規則になっていることが暗黙的に読み取れますが、これは、Javaを使ってプログラミングしている人にとっては、常識的な話ですね。
この暗黙的な変換は、JavaBeans APIの、java.beans.Introspector#decapitalize()メソッドにて実装されています。そこでは、以下のように仕様が説明されています。
文字列を引数に取り、通常の Java 変数名の大文字使用法に従って変換するユーティリティメソッドです。通常は最初の文字を大文字から小文字に変換しますが、この変換を行わない特殊なケースもあります (複数の文字が存在し、先頭の文字と 2 番目の文字がどちらも大文字である場合など)。では、実際に、いくつかの例で試して見ましょう。たとえば、「FooBah」は「fooBah」、「X」は「x」に変換されますが、「URL」は変換されません。
結果は以下の通りとなります。
(1) FooBah --> fooBah
(2) X --> x
(3) URL --> URL
(4) UR_L --> UR_L
(5) U_RL --> u_RL
(6) U2_RL --> u2_RL
(7) _FooBah --> _FooBah
Introspector#decapitalize()メソッドのソースを見ると、先頭の2文字が両方とも英大文字(Character#isUpperCase())の場合以外は、先頭1文字を、Character#toLowerCase()しているようです。
結果を分類すると、
- (1)(2): 「通常の Java 変数名の大文字使用法」に適合している。
- (3)(4): 「特殊なケース」に該当するので、変換されなかった。
- (5)(6): 何となく違和感のある変換が行われた。
- (7) : 先頭がアルファベットではないため、変換されなかった。
(1)~(4)については、仕様にて明記されている挙動なので、問題ないでしょう。(7)は、特に実害はないように思います。(5)と(6)については、「特殊なケース」の方に分類されると期待されるところが、そうではなかったという感じです。
実際のシステムでは、プロジェクトの事情から、(5)と(6)のようなプロパティ名を付与せざるを得ない場合もあります。例えば、Webサービスで非Javaのシステムとの接続をする場合に、相手側主導でインタフェース設計が行われると、A3_CUSTOMER_IDのような(6)に該当する名称のプロパティが定義されることがあります。ここで、WebLogicのservicegenのようなツールを使って、WSDLを自動生成すると、complexTypeにa3_CUSTOMER_IDというエレメントが生成されます。これは、JAX-RPC仕様では、WSDLのcomplexTypeは、JavaBeansクラスにマッピングすることが決められており、エレメント名にはBeanのプロパティ名が設定されることによります。しかしながら、アプリケーションレベルのインタフェース設計に対しては不適合な状態になってしまいます。
最も理想的な解決策は、(1)(2)以外の場合は、すべて「特殊なケース」になるように、Introspectorを変更することですが、JavaBeans仕様なのでそれは現実的ではありません。
従って、このような制約を、当初から意識した上で、問題を回避するための命名規約を作成しておくことが適切な対応だと思います。具体的には、以下のいずれかになります。
- 「通常の Java 変数名の大文字使用法」に適合しない名称を許可しない。
- 先頭の2文字は、英大文字のみを許可する。
SOAという考え方が広まるにつれ、Javaアプリケーションが、非Javaシステムと接続する機会が多くなってきていると思いますが、そのときに、この話がお役に立てば幸いです。