【コラム】
J2SE 1.5で導入されたEoDのうち、地味ではあるものの便利になった機能にStatic Importがある。これは名前の通り、staticが指定された変数やメソッド、つまりクラス変数やクラスメソッドをimportするための機能だ。Static Importを使うとソースコードの記述を簡略化できる。
C言語で平方根を求めるソースコードの例をリスト1に示す。
これをJ2SE 1.4で動作するJavaで作成した場合の例をリスト2に示す。
ここで注目するべきは、C言語ではsqrt(2.0)のように記述できている部分を、JavaではMath.sqrt(2)のように実装している点にある。
java.lang.Mathは平方根以外にも三角関数や指数関数、対数関数といった数値計算の基本となる処理を実現するためのクラスで、その処理はすべてクラスメソッドで提供されている。J2SE 1.4以前ではこうした計算を行うにはかならずMath.sqrt()のように実装する必要がある。
J2SE 5.0で導入されたStatic Importを使うとこの実装を簡略化することができる。たとえばリスト2をStatic Importを使って書き換えたソースコードをリスト3に示す。
まず、J2SE 5.0で新しく導入された記述方法がリスト4だ。import staticの指定で、クラス変数やクラスメソッドが指定できるようになっている。
import staticのあとに指定されたクラスメソッドやクラス変数は、従来のようにMath.sqrtと記述せずとも、リスト4で指定した最後の文字列、つまりクラスメソッド名やクラス変数名だけで使うことができる。このため、リスト5のようにsqrt(2)と記述することができる。sqrt(2)はStatic Importでjava.lang.Math.sqrtと明示されているから、java.lang.Math.sqrt(2)のことだとわかる。
java.lang.Mathの例だと、C/C++言語と書き方が近くなっただけかと思うかもしれないが、効果はそれだけではない。
クラス名がやたら長かったり、クラス変数名やクラスメソッド名がやたら長いことがある。たとえばJFC/Swingにはそういった変数が多い。これらを"クラス名.クラスメソッド名"や"クラス名.クラス変数名"で指定するのは、冗長と感じられる場面も多かった。Static Importを使うとその点がすっきりする。
そのほかの例としては、java.awt.Colorには代表的な色がクラス変数として定義されている。J2SE 1.4以前でこれを使うには、java.awt.Colorをimportした後で、Color.REDやColor.BLUEのように指定する必要がある。
オブジェクト指向のプログラミング言語としてこうしたショートカット記述を許可することの是非はともかくとして、java.awt.Color.*をimport staticしておけば、それらはREDやBLUEだけで使えるようになる。Color.RED、Color.BLUEのように記述するよりも、REDやBLUEの方が記述はすっきりする。
クラス変数やクラスメソッド、または変数やメソッドをStatic Importを指定した場合と同じように使う方法はJ2SE 1.4以前でもテクニックとしては存在していた。インターフェースやクラスとしてクラス変数やクラスメソッド、または変数やメソッドを作成し、それらを実装したり継承するのだ。そうすれば、変数名をそのまま指定して使用できる。
しかし、そうした使用はオブジェクト指向のプログラミング言語としては、記述を簡単にするための誤った使い方だ。継承や実装は、変数やメソッドの名前指定を短縮するための機能ではない。Static Importを使えば、そういった誤った実装をしなくとも、記述の面を有利にすることができる。ショートカット記述を許可することで、J2SE 1.4以前のプログラマにはわかりにくくなったという面はあるが、便利になったこともまた確だ。
MathTest.javaをコンパイルしたものを逆コンパイルすると、実際はどのように実装が行われたかがわかる。MathTest.javaをコンパイルしたものを逆コンパイルするしたものをリスト6に示す。
リスト6 MathTest.javaをコンパイルしたものを逆コンパイルしたもの
リスト6の場合、Static Import以外にも、可変引数、printf、AutoboxingなどのEoDが使われているためわかりにくいが、sqrt(2)がMath.sqrt(2D)のように変わっていることがわかるだろう。つまり、Static Import指定されたクラス変数やクラスメソッドは従来の指定へのSyntax Sugarということになる。
Static ImportのSyntax Sugarも、実行速度に大きく関与するものではない。多用するとどのクラスの変数やメソッドを指しているのかわかりにくくなってしまうが、たしかに便利な機能だ。ソースコードを読みやすくする目的においては積極的に採用してかまわないだろう。
| トマトを食べれば痩せられる!? -京大ら、新発見の成分で肥満改善効果を実証 [21:00 2/10] |
| JAXA、液体シリコン中に残存する共有結合を観察 -大口径ウェハの実現に期待 [20:11 2/10] |
| NEDOなど、熱膨張が小さな樹脂複合材料ペレットの量産化に成功 [19:22 2/10] |
| 理研、一般顕微鏡を蛍光顕微鏡に強化できるアダプタを試作して性能を実証 [19:15 2/10] |
| 天の川のブラックホールが小惑星を飲み込んでいる - NASAが発表 [18:08 2/10] |
|
激シブ!もう一度ゴルフ Ⅱ の魅力を味わってみませんか?【大阪オートメッセ2012】 [03:06 2/11] キャリア |
|
『ヘタリア』キャラソン、新シリーズが配信決定! [03:05 2/11] キャリア |
|
全国の温泉を擬人化したドラマCD、第1弾「草津」は櫻井孝宏さん! [03:05 2/11] キャリア |
|
柿原徹也さんの2ndミニアルバム「CONTINUOUS」2月15日発売 [03:04 2/11] キャリア |
|
アニメ「Fate/Zero」陣営ごとのお守りが発売決定 [03:03 2/11] キャリア |