static インポート

static メンバーにアクセスするには、そのメンバーのクラスで参照を修飾する必要があります。たとえば次のようにしなければなりません。
double r = Math.cos(Math.PI * theta);
この状況を回避するため、static メンバーをインタフェースに置いて、そのインタフェースから継承させることがあります。しかし、これは良い方法ではありません。実際、定数インタフェースアンチパターンという名前があるほど悪い方法です。「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 インポートを使用するのは、そうしないと定数のローカルコピーを宣言してしまう場合や、継承を乱用してしまう場合 (定数インタフェースアンチパターン) だけです。つまり、1 つまたは 2 つのクラスから static メンバーに頻繁にアクセスする必要がある場合に使用してください。static インポートを使いすぎると、インポートしたすべての static メンバーでプログラムの名前空間が煩雑になるため、プログラムが判読不可能になり、保守不可能になる可能性があります。プログラムのコードを読んだ人は (プログラムの作成者が数か月後に読んだ場合でも)、static メンバーがどのクラスに属していたのか理解できないでしょう。すべての static メンバーをクラスからインポートすると、特に可読性に悪影響があります。1 つか 2 つしかメンバーを必要としない場合は、個別にインポートしてください。static インポートを適切に使用すれば、クラス名の繰り返しを省くことができ、プログラムをより読みやすくすることも可能です。


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.