Java

static のインポート

Language の目次


static メンバーにアクセスするには、そのメンバーのクラスで参照を修飾する必要があります。たとえば次のようにしなければなりません。
double r = Math.cos(Math.PI * theta);
この状況を回避するため、static メンバーをインタフェースに置いて、そのインタフェースから継承させることがあります。しかし、これは良い方法ではありません。実際、「Constant Interface Antipattern (不変のインタフェースアンチパターン)」であると以前から指摘され続けています。「Effective Java」の第 17 項を参照してください。問題は、クラスが別のクラスの static メンバーを使用するのは、実装のほんのわずかな部分だということです。クラスがインタフェースを実装すると、そのインタフェースはそのクラスの公開 API の一部となります。実装の詳細は、公開 API として公開するべきではありません。

static のインポート構造により、static メンバーを含む型から継承しなくても、static メンバーに対する非修飾のアクセスが可能になります。代わりに、プログラムがメンバーを個別に、またはまとめてインポートします。 個別の例を次に示します。

import static java.lang.Math.PI;
まとめてインポートの例を次に示します。
import static java.lang.Math.*;
static メンバーをインポートすると、修飾なしで使用できます。
double r = cos(PI * theta);
static のインポート宣言は、通常のインポート宣言と似ています。通常のインポート宣言では、パッケージからクラスをインポートすることで、パッケージ修飾なしでクラスを使用できるようにします。 一方、static のインポート宣言では、クラスから static メンバーをインポートすることで、クラス修飾なしで static メンバーを使用できるようにします。

static インポートを使用しなければならないケースは、ほとんどありません。static インポートを使用するのは、そうしないと定数のローカルコピーを宣言してしまう場合や、継承を不正に使用してしまう場合 (Constant Interface Antipattern) だけです。つまり、1 つまたは 2 つのクラスから static メンバーに頻繁にアクセスする必要がある場合に使用してください。static のインポートを使いすぎると、インポートしたすべての static メンバーでプログラムの名前空間が煩雑になるため、プログラムが判読不可能になり、保守不可能になる可能性があります。プログラムのコードを読んだ人は (プログラムの作成者が数か月後に読んだ場合でも)、static メンバーがどのクラスに属していたのか理解できないでしょう。すべての static メンバーをクラスからインポートすると、可読性に明らかな影響があります。 1 つか 2 つしかメンバーを必要としない場合は、個別にインポートしてください。static のインポートを適切に使用すれば、クラス名を繰り返す定形句を省くことができ、プログラムをより読みやすくすることも可能です。


Copyright © 2004 Sun Microsystems, Inc. All Rights Reserved. Sun

Java Software