【コラム】

ライトニングJava

19 地味だけど便利! - Static Import

    後藤大地  [2005/09/12]

    J2SE 1.5で導入されたEoDのうち、地味ではあるものの便利になった機能にStatic Importがある。これは名前の通り、staticが指定された変数やメソッド、つまりクラス変数やクラスメソッドをimportするための機能だ。Static Importを使うとソースコードの記述を簡略化できる。

    Static Import

    C言語で平方根を求めるソースコードの例をリスト1に示す。

    リスト1 mathtest.c

    int main(int argc, char *argv[]) {     printf("%.15f\n", sqrt(2.0)); }

    これをJ2SE 1.4で動作するJavaで作成した場合の例をリスト2に示す。

    リスト2 J2SE 1.4でも動作するMathTest14.java

    public class MathTest14 {
        public static void main(String[] anyArguments) {
            System.out.printf("%.15f\n", Math.sqrt(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に示す。

    リスト3 Static Import を使った場合の MathTest.java

    import static java.lang.Math.sqrt;

    public class MathTest {
        public static void main(String[] anyArguments) {
            System.out.printf("%.15f\n", sqrt(2));
        }
    }

    まず、J2SE 5.0で新しく導入された記述方法がリスト4だ。import staticの指定で、クラス変数やクラスメソッドが指定できるようになっている。

    リスト4 Static Import

    import static java.lang.Math.sqrt;

    import staticのあとに指定されたクラスメソッドやクラス変数は、従来のようにMath.sqrtと記述せずとも、リスト4で指定した最後の文字列、つまりクラスメソッド名やクラス変数名だけで使うことができる。このため、リスト5のようにsqrt(2)と記述することができる。sqrt(2)はStatic Importでjava.lang.Math.sqrtと明示されているから、java.lang.Math.sqrt(2)のことだとわかる。

    リスト5 Static Import されたクラスメソッドの使用例

            System.out.printf("%.15f\n", sqrt(2));

    Static Importの効果

    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以前のプログラマにはわかりにくくなったという面はあるが、便利になったこともまた確だ。

    Static Importの裏舞台

    MathTest.javaをコンパイルしたものを逆コンパイルすると、実際はどのように実装が行われたかがわかる。MathTest.javaをコンパイルしたものを逆コンパイルするしたものをリスト6に示す。

    リスト6 MathTest.javaをコンパイルしたものを逆コンパイルしたもの

    public class MathTest
    {
        public static void main(String args[])
        {
            System.out.printf("%.15f\n", new Object[] {
                Double.valueOf(Math.sqrt(2D))
            });
        }
    }

    リスト6の場合、Static Import以外にも、可変引数、printf、AutoboxingなどのEoDが使われているためわかりにくいが、sqrt(2)がMath.sqrt(2D)のように変わっていることがわかるだろう。つまり、Static Import指定されたクラス変数やクラスメソッドは従来の指定へのSyntax Sugarということになる。

    Static ImportのSyntax Sugarも、実行速度に大きく関与するものではない。多用するとどのクラスの変数やメソッドを指しているのかわかりにくくなってしまうが、たしかに便利な機能だ。ソースコードを読みやすくする目的においては積極的に採用してかまわないだろう。

    提供:毎日就職ナビ

    会員登録はこちら

    学生のための就職情報サイト「毎日就職ナビ」。4,000社以上の新卒採用情報が常時掲載され、社内の雰囲気が伝わる情報画面、さまざまな項目での会社検索、エントリーや説明会検索など、機能も充実。無料適職診断、就活Q & A、エントリーシート添削講座など、就職活動に役立つ記事も満載です。研究者、エンジニアを目指す学生の方々も是非エントリーしてください。お待ちしています!

    毎日コミュニケーションズ 就職情報事業本部はプライバシーマークを取得しています。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン