次のクラスを検討してください
public final class Constant {
public static final String USER_NAME="user1";
//more constant here
}
パッケージBのこのクラス。
これをパッケージAで使用します。次の2つの使用方法を検討してください。
方法1-import B.Constant
を使用します
import B.Constant;
public class ValidateUser {
public static void main(String[] args) {
if(Constant.USER_NAME.equals("user1")){
}
}
}
方法2-import static B.Constant.USER_NAME;
を使用する
import static B.Constant.USER_NAME;
public class ValidateUser {
public static void main(String[] args) {
if(USER_NAME.equals("user1")){
}
}
}
私の質問は、この場合、静的インポートと比較して通常のインポートとの違いまたは利点はありますか?
通常のimport
とimport static
の唯一の違いは、後者が他のクラスまたはインターフェイスのstatic
メンバーを移動するためのものであることです-特に定数—スコープに。使用するかどうかはあなた次第です。クラスのボディを短く保つので気に入っていますが、YMMVです。
同一のバイトコードにコンパイルされるため、それらを使用してもパフォーマンス上の利点やペナルティはありません(コンパイル時の場合を除いて、それを気にかけているように)。
主な違いはReadablityであり、Constant.USER_NAME
はUSER_NAME
と比較すると読みにくくなります。
From Documentation :
静的インポートを適切に使用すると、クラス名の繰り返しのボイラープレートを削除して、プログラムを読みやすくすることができます。
しかし、いずれにせよ、実行しないようにしてください
import static B.Constant.*;
インポートしたすべての静的メンバーで名前空間を汚染する可能性があるためです。
静的インポートを使用することは非常にまれで、実際にコードを少し簡単に理解できる場所でのみ使用します。
オラクルによると:
http://docs.Oracle.com/javase/1.5.0/docs/guide/language/static-import.html
それでは、静的インポートをいつ使用する必要がありますか?非常に控えめに!定数のローカルコピーを宣言したり、継承を悪用したりしたい場合(定数インターフェイスのアンチパターン)にのみ使用してください。つまり、1つまたは2つのクラスの静的メンバーに頻繁にアクセスする必要がある場合に使用します。静的インポート機能を使いすぎると、プログラムが読みにくく、保守できなくなり、インポートするすべての静的メンバーで名前空間が汚染されます。あなたのコードの読者(あなたが書いた数か月後のあなたを含む)は、静的メンバーがどのクラスから来たかを知りません。クラスからすべての静的メンバーをインポートすると、読みやすさに特に害を及ぼす可能性があります。 1つまたは2つのメンバーだけが必要な場合は、個別にインポートします。静的インポートを適切に使用すると、クラス名の繰り返しのボイラープレートを削除して、プログラムを読みやすくすることができます。
ここで注意すべき重要な点:
コメンターの@Donal Fellowsは、IDEを使用して静的インポートを管理する方がリスクが少ないと適切に述べています。最新のIDEは長い道のりを歩んでおり、管理の多くの苦痛を取り除くでしょう。依存関係とトレースメソッドは、親にコールバックします。
静的インポート静的メンバーをクラス名で修飾しないようにします。
静的メンバーがインポートされると、クラス名の接頭辞なしでコードで使用できます。
良い例え:
import static sample.SampleStaticValues.NUM_ZERO;
…
enum OddEven {odd,even}
//need not do SampleConstants.NUM_ZERO due to static import feature
if(num % 2 == NUM_ZERO){
System.out.println("The num " + num + " is: " + OddEven.even);
}
package sample;
public class SampleStaticValues {
public static int NUM_ZERO = 0;
public static int NUM_ONE = 0;
}
静的インポートは、時間と入力を節約するために使用されます。同じものを何度も入力したくない場合は、そのようなインポートが興味深いかもしれません。
importを使用すると、Javaプログラマはパッケージ修飾なしでパッケージのクラスにアクセスできます。
S tatic import機能を使用すると、クラス修飾なしでクラスの静的メンバーにアクセスできます。
以下の例の助けを借りてこれを理解しましょう:
例1:静的インポートなし
class Demo1{
public static void main(String args[])
{
double var1= Math.sqrt(5.0);
double var2= Math.tan(30);
System.out.println("Square of 5 is:"+ var1);
System.out.println("Tan of 30 is:"+ var2);
}
}
出力:
Square of 5 is:2.23606797749979
Tan of 30 is:-6.405331196646276
例2:静的インポートの使用
import static Java.lang.System.out;
import static Java.lang.Math.*;
class Demo2{
public static void main(String args[])
{
//instead of Math.sqrt need to use only sqrt
double var1= sqrt(5.0);
//instead of Math.tan need to use only tan
double var2= tan(30);
//need not to use System in both the below statements
out.println("Square of 5 is:"+var1);
out.println("Tan of 30 is:"+var2);
}
}
出力:
Square of 5 is:2.23606797749979
Tan of 30 is:-6.405331196646276
今日、私たちは静的インポートの大きな欠点に遭遇しました。以下でそれを共有するだけです。
静的メンバーにアクセスするには、参照元のクラスで参照を修飾する必要があります。たとえば、次のように言う必要があります。
double r = Math.cos(Math.PI * theta);
or
System.out.println("Blah blah blah");
Mathのような静的クラスメンバーの不要な使用を避けたい場合があります。とシステム。これには静的インポートを使用します。たとえば、静的インポートを使用して変更された上記のコードは、次のように変更されます。
import static Java.lang.System.out;
import static Java.lang.Math.PI;
import static Java.lang.Math.cos;
...
double r = cos(PI * theta);
out.println("Blah blah blah");
...
では、上記のテクニックを使用する利点は何ですか?私が見る唯一の利点は、コードの可読性です。静的クラスの名前を書く代わりに、メソッドまたはメンバー変数名を直接書くことができます。また、ここで1つのことを覚えておいてください。あいまいな静的インポートは許可されていません。つまり、Java.lang.Math.PIをインポートしていて、mypackage.Someclass.PIをインポートしたい場合、コンパイラーはエラーをスローします。したがって、インポートできるメンバーPIは1つだけです。