J2SE 5.0 の言語仕様の新機能の続きです。
Varargs
C 言語の Varargs のように不定長の引数リストを処理する機能が導入されました。
これまで、foo(new Object[]{bar, baz, foobar}) という形式で書いていたメソッドを呼び出しを、foo(bar, baz, foobar) と書けるようにするというもので、コンパイラが従来の形式に変換しているものと思われます。
C 言語になれているプログラマにとって、読みやすい・書きやすいというメリットがありますが、それ以上の積極的な意味はわかりません。
また、従来型の記述と Varargs を使用した場合の記述の併用はどうなるのか、オーバーロードで処理できるのか、あるいは Varargs で受け取った最初の引数が Object[] であれば従来型記述とみなすのか、その辺は調べる必要があると思います。
Static Imports
これまでインポートは、クラスを使用する際に、パッケージ名を省略できるようにするという機能だけだったのですが、今回、スタティックフィールド、スタティックメソッドを参照する際にパッケージ名およびクラス名を省略できるという機能が追加されました。
これに関しては、これだけです。ここにも書かれているように、濫用はコードの可読性を著しく下げますので、必要なところだけ使用すべきでしょう。
アノテーション (メタデータ)
言語仕様の新機能の最後に紹介されるのが、アノテーションです。
これは、端的に言うとクラス定数に対する新しい記法の追加です。
クラス定数の記述には、これまで public static final ... といった記法を使用していました。この記法では、クラス内で定義した公開定数との違いを明確にすることができないので、別のスコープに置こうというのがアノテーションです。
アノテーションを使用するには、アノテーションを定義するインタフェースを定義し、アノテーションを適用したいクラスの修飾子としてアノテーションとその値とを設定する必要があります。
アノテーションは、クラスのメンバとしてアクセスすることはできないため、リフレクションを通してアクセスする必要があります。このため、アクセスへの手間はかかりますが、クラスメンバとして見えないので、インタフェースを整理できるという利点があります。
具体的な使用例としては、.NET Framework における XML シリアライザがあります。
JAXB や Apache Axis を使用して XML スキーマや WSDL を Java クラスに変換したことのある方は、XML スキーマで定義された複合型を実装する Java クラスにおまじないのようなクラス定数、プロパティが生成されているのをご覧になっていると思います。JAXB や Apache Axis のシリアライザがこれらの定数を使用して、XML 文書と Java クラスの間の変換を実行しているわけです。
これに対して、.NET Framework では、JAXB や Apache Axis がクラス定数として吐き出している内容の大部分を XmlSerializer クラスに実装し、最小限必要な値、たとえば XML 要素名や XML 名前空間などを属性として表記するようになっています。
これにより、(シリアライザの実装は複雑になりますが) スキーマの実装クラスの表記は明解になり、かつエディタの入力補助機能にも (通常は) 不要な値が出てこなくなりますので、プログラミングにおけるエラーの減少にもつながるものになります。
ただし、.NET Framework の場合、XML スキーマの enum 値が C# のキーワードなどコード上で表現できない値とバッティングすると勝手に定数値をでっち上げるので、本来の値を取るために enum 型からリフレクションを使って値を取り出す必要が出てきます。
# やってみるとわかりますが、結構面倒です。
この辺は、Java の enum により、改善が可能だとは思いますが、アノテーションを使用する場合は、プログラマが使いたい値は何かということを常に意識して、アノテーションで隠蔽するか、クラスのスタティックフィールドに見せるかを決めていく必要があると思います。
以上、J2SE 5.0 で導入された言語仕様上の新機能を紹介しました。
自分は Java は初心者なので、クラスライブラリの変更については十分に紹介することができません。ということで、このあとはこれらの新機能を使った (といっても、主になるのは enum とアノテーションですが) サンプルを少しずつ考えていきたいと思います。
Varargs
C 言語の Varargs のように不定長の引数リストを処理する機能が導入されました。
これまで、foo(new Object[]{bar, baz, foobar}) という形式で書いていたメソッドを呼び出しを、foo(bar, baz, foobar) と書けるようにするというもので、コンパイラが従来の形式に変換しているものと思われます。
C 言語になれているプログラマにとって、読みやすい・書きやすいというメリットがありますが、それ以上の積極的な意味はわかりません。
また、従来型の記述と Varargs を使用した場合の記述の併用はどうなるのか、オーバーロードで処理できるのか、あるいは Varargs で受け取った最初の引数が Object[] であれば従来型記述とみなすのか、その辺は調べる必要があると思います。
Static Imports
これまでインポートは、クラスを使用する際に、パッケージ名を省略できるようにするという機能だけだったのですが、今回、スタティックフィールド、スタティックメソッドを参照する際にパッケージ名およびクラス名を省略できるという機能が追加されました。
これに関しては、これだけです。ここにも書かれているように、濫用はコードの可読性を著しく下げますので、必要なところだけ使用すべきでしょう。
アノテーション (メタデータ)
言語仕様の新機能の最後に紹介されるのが、アノテーションです。
これは、端的に言うとクラス定数に対する新しい記法の追加です。
クラス定数の記述には、これまで public static final ... といった記法を使用していました。この記法では、クラス内で定義した公開定数との違いを明確にすることができないので、別のスコープに置こうというのがアノテーションです。
アノテーションを使用するには、アノテーションを定義するインタフェースを定義し、アノテーションを適用したいクラスの修飾子としてアノテーションとその値とを設定する必要があります。
アノテーションは、クラスのメンバとしてアクセスすることはできないため、リフレクションを通してアクセスする必要があります。このため、アクセスへの手間はかかりますが、クラスメンバとして見えないので、インタフェースを整理できるという利点があります。
具体的な使用例としては、.NET Framework における XML シリアライザがあります。
JAXB や Apache Axis を使用して XML スキーマや WSDL を Java クラスに変換したことのある方は、XML スキーマで定義された複合型を実装する Java クラスにおまじないのようなクラス定数、プロパティが生成されているのをご覧になっていると思います。JAXB や Apache Axis のシリアライザがこれらの定数を使用して、XML 文書と Java クラスの間の変換を実行しているわけです。
これに対して、.NET Framework では、JAXB や Apache Axis がクラス定数として吐き出している内容の大部分を XmlSerializer クラスに実装し、最小限必要な値、たとえば XML 要素名や XML 名前空間などを属性として表記するようになっています。
これにより、(シリアライザの実装は複雑になりますが) スキーマの実装クラスの表記は明解になり、かつエディタの入力補助機能にも (通常は) 不要な値が出てこなくなりますので、プログラミングにおけるエラーの減少にもつながるものになります。
ただし、.NET Framework の場合、XML スキーマの enum 値が C# のキーワードなどコード上で表現できない値とバッティングすると勝手に定数値をでっち上げるので、本来の値を取るために enum 型からリフレクションを使って値を取り出す必要が出てきます。
# やってみるとわかりますが、結構面倒です。
この辺は、Java の enum により、改善が可能だとは思いますが、アノテーションを使用する場合は、プログラマが使いたい値は何かということを常に意識して、アノテーションで隠蔽するか、クラスのスタティックフィールドに見せるかを決めていく必要があると思います。
以上、J2SE 5.0 で導入された言語仕様上の新機能を紹介しました。
自分は Java は初心者なので、クラスライブラリの変更については十分に紹介することができません。ということで、このあとはこれらの新機能を使った (といっても、主になるのは enum とアノテーションですが) サンプルを少しずつ考えていきたいと思います。
※コメント投稿者のブログIDはブログ作成者のみに通知されます