web-dev-qa-db-ja.com

インポートよりも静的インポートを使用する利点はありますか?

次のクラスを検討してください

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")){

   }
 }
}

私の質問は、この場合、静的インポートと比較して通常のインポートとの違いまたは利点はありますか?

通常のimportimport staticの唯一の違いは、後者が他のクラスまたはインターフェイスのstaticメンバーを移動するためのものであることです-特に定数—スコープに。使用するかどうかはあなた次第です。クラスのボディを短く保つので気に入っていますが、YMMVです。

同一のバイトコードにコンパイルされるため、それらを使用してもパフォーマンス上の利点やペナルティはありません(コンパイル時の場合を除いて、それを気にかけているように)。

32
Donal Fellows

主な違いはReadablityであり、Constant.USER_NAMEUSER_NAMEと比較すると読みにくくなります。

From Documentation

静的インポートを適切に使用すると、クラス名の繰り返しのボイラープレートを削除して、プログラムを読みやすくすることができます。

しかし、いずれにせよ、実行しないようにしてください

import static B.Constant.*;

インポートしたすべての静的メンバーで名前空間を汚染する可能性があるためです。

20
Sajan Chandran

静的インポートを使用することは非常にまれで、実際にコードを少し簡単に理解できる場所でのみ使用します。

オラクルによると:

http://docs.Oracle.com/javase/1.5.0/docs/guide/language/static-import.html

それでは、静的インポートをいつ使用する必要がありますか?非常に控えめに!定数のローカルコピーを宣言したり、継承を悪用したりしたい場合(定数インターフェイスのアンチパターン)にのみ使用してください。つまり、1つまたは2つのクラスの静的メンバーに頻繁にアクセスする必要がある場合に使用します。静的インポート機能を使いすぎると、プログラムが読みにくく、保守できなくなり、インポートするすべての静的メンバーで名前空間が汚染されます。あなたのコードの読者(あなたが書いた数か月後のあなたを含む)は、静的メンバーがどのクラスから来たかを知りません。クラスからすべての静的メンバーをインポートすると、読みやすさに特に害を及ぼす可能性があります。 1つまたは2つのメンバーだけが必要な場合は、個別にインポートします。静的インポートを適切に使用すると、クラス名の繰り返しのボイラープレートを削除して、プログラムを読みやすくすることができます。

ここで注意すべき重要な点:

  • 1つまたは2つのクラスの静的メンバーに頻繁にアクセスする必要がある場合に使用します
  • 静的インポートを適切に使用すると、プログラムが読みやすくなります

コメンターの@Donal Fellowsは、IDEを使用して静的インポートを管理する方がリスクが少ないと適切に述べています。最新のIDEは長い道のりを歩んでおり、管理の多くの苦痛を取り除くでしょう。依存関係とトレースメソッドは、親にコールバックします。

9
Husman

静的インポート静的メンバーをクラス名で修飾しないようにします。

静的メンバーがインポートされると、クラス名の接頭辞なしでコードで使用できます。

良い例え:

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;
}
2
Maxim Shoustin

静的インポートは、時間と入力を節約するために使用されます。同じものを何度も入力したくない場合は、そのようなインポートが興味深いかもしれません。

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
1
Rahul Agrawal

今日、私たちは静的インポートの大きな欠点に遭遇しました。以下でそれを共有するだけです。

  1. XXXConsts.Javaには、AbstractService.Javaから拡張されるクラスXXXComceteImpl.Javaに静的にインポートされたEVENT_ID(EVENT_ID = "EVENT_ID")がありました
  2. AbstractService.Javaから拡張されるXXXZeloImpl.Javaは、EVENT_ID = "eventId"を必要としていました。したがって、EVENT_ID = "eventId"がAbstractService.Javaで宣言されました。
  3. XXXComceteImpl.JavaのEVENT_IDがAbstractService.JavaのEVENT_IDを参照していたため、#1が壊れました。
  4. EVENT_ID = "eventId"の名前が異なる可能性があります。
  5. :-分類された名前は編集されたバージョンなので、異常に見えます。
0
Hari Rao

静的メンバーにアクセスするには、参照元のクラスで参照を修飾する必要があります。たとえば、次のように言う必要があります。

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つだけです。

0
SpringLearner