「インポート」の後の「静的」修飾子は何を意味しますか?


438

このように使用すると:

import static com.showboy.Myclass;

public class Anotherclass{}

違いは何だimport static com.showboy.Myclassとはimport com.showboy.Myclass

回答:


390

ドキュメントを見る

静的インポート宣言は、通常のインポート宣言に類似しています。通常のインポート宣言がパッケージからクラスをインポートし、パッケージ修飾なしでそれらを使用できる場合、静的インポート宣言はクラスから静的メンバーをインポートし、クラス修飾なしでそれらを使用できるようにします。

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


28
@xslによる上記の警告に完全に同意します。それが間違いなく非常に役立つ1つの領域は、junitのAssertですすべての単体テストに静的なorg.junit.Assert。*インポートします。
BxlSofty 2014年

3
-単純な説明を書く代わりに、非常に目を引くドキュメントファイルではなく、非常に長く貼り付けるコントロール。
BłażejMichalik

@xsl投稿の下部は引用ブロックにあるはずですか?入力したようです。
Ferrybig 2016

1
@Ferrybig:リンクされたドキュメントからの引用です。
Joshua Snider 2016

includeRuby のようなものです。
クロエ、

227

あなたが述べる2つのインポートの間に違いはありません。ただし、静的インポートを使用して、他のクラスの静的メンバーへの非修飾アクセスを許可することができます。私がこれをしなければならなかった場所:

import org.apache.commons.lang.StringUtils;
      .
      .
      .
if (StringUtils.isBlank(aString)) {
      .
      .
      .

私がすることができます:

import static org.apache.commons.lang.StringUtils.isBlank;
      .
      .
      .
if (isBlank(aString)) {
      .
      .
      .

詳細については、ドキュメントをご覧ください。


57

静的インポートは、クラスの静的フィールド/メソッドをインポートする代わりに使用されます。

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

あなたは書ける :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

コードで別のクラスの定数を頻繁に使用する場合や、静的なインポートがあいまいでない場合に役立ちます。

ところで、あなたの例では "import static org.example.Myclass;" 機能しません:importはクラス用、import staticはクラスの静的メンバー用です。


37

静的インポートの基本的な考え方は、静的クラス、静的変数、または列挙型を使用しているときはいつでも、それらをインポートして、タイピングを省くことができるということです。

例を挙げてポイントを詳しく説明します。

import java.lang.Math;

class WithoutStaticImports {

 public static void main(String [] args) {
  System.out.println("round " + Math.round(1032.897));
  System.out.println("min " + Math.min(60,102));
 }
}

静的インポートを使用した同じコード:

import static java.lang.System.out;
import static java.lang.Math.*;

class WithStaticImports {
  public static void main(String [] args) {
    out.println("round " + round(1032.897));
    out.println("min " + min(60,102));
  }
}

:静的インポートを使用すると、コードが読みにくくなる場合があります。


4
import static java.lang.Mathアスタリスクなしで書くことは何を意味するでしょうか?
Chris Middleton、

1
@AmadeusDrZaiusいいえ、静的インポートはクラスの静的メンバー専用です。
Harry

1
いい答えです!しかし、多くの「初心者」がこの投稿を読んだので、1つ小さな警告を与える必要があります。名前空間の汚染を防ぐためにアスタリスク使いすぎないでください
goerlibe 2017

24

「静的static com.showboy.Myclassのインポート」と「com.showboy.Myclassのインポート」の違いは何ですか?

静的インポートはフィールドまたはメンバータイプのインポートに対してのみ機能するため、最初のコードはコンパイラエラーを生成するはずです。(MyClassが内部クラスまたはshowboyのメンバーではないと想定)

あなたが意味したと思う

import static com.showboy.MyClass.*;

MyClassのすべての静的フィールドとメンバーを、修飾する必要なく実際のコンパイルユニットで使用できるようにします...


14

importJavaプログラマは、パッケージの資格なしでパッケージのアクセスクラスにできます。

このstatic import機能により、クラス修飾なしでクラスの静的メンバーにアクセスできます。

import一方のクラスおよびインタフェースにアクセス可能性を提供するstatic importクラスの静的メンバにアクセス可能性を提供します。

例:

インポート

import java.lang.System.*;    
class StaticImportExample{  
    public static void main(String args[]){  

       System.out.println("Hello");
       System.out.println("Java");  

  }   
} 

静的インポート

import static java.lang.System.*;    
class StaticImportExample{  
  public static void main(String args[]){  

   out.println("Hello");//Now no need of System.out  
   out.println("Java");  

 }   
} 

参照:Java 5の静的インポートとは


2

あなたが呼ばれるクラス内の静的フィールドとメソッドを持っていると言うMyClassと呼ばれるパッケージの内側にmyPackage、あなたは次のように入力してそれらを直接アクセスする myStaticFieldか、myStaticMethod毎回入力しなくてもMyClass.myStaticFieldMyClass.myStaticMethod

注:import myPackage.MyClass またはを実行してmyPackage.* 、他のリソースにアクセスする必要があります


1

static後の修飾子importは、クラスの静的フィールドを取得/使用するためのものです。私が使用する1つの領域はimport static、クラスから定数を取得することです。import static静的メソッドにも適用できます。間違いなimport staticので、必ずタイプしてくださいstatic import

何がstatic importJavaで- JavaRevisited -についてもっと知るためにA非常に優れたリソースimport static

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.