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


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