Was bedeutet der Modifikator "statisch" nach "Import"?

438

Bei folgender Verwendung:

import static com.showboy.Myclass;

public class Anotherclass{}

Was ist der Unterschied zwischen import static com.showboy.Myclassund import com.showboy.Myclass?

JSON
quelle

Antworten:

390

Siehe Dokumentation

Die statische Importdeklaration ist analog zur normalen Importdeklaration. Wenn die normale Importdeklaration Klassen aus Paketen importiert, sodass sie ohne Paketqualifizierung verwendet werden können, importiert die statische Importdeklaration statische Elemente aus Klassen, sodass sie ohne Klassenqualifizierung verwendet werden können.

Wann sollten Sie den statischen Import verwenden? Sehr sparsam! Verwenden Sie es nur, wenn Sie sonst versucht wären, lokale Kopien von Konstanten zu deklarieren oder die Vererbung zu missbrauchen (das Antipattern der Konstantenschnittstelle). Mit anderen Worten, verwenden Sie es, wenn Sie häufigen Zugriff auf statische Elemente aus einer oder zwei Klassen benötigen. Wenn Sie die statische Importfunktion überbeanspruchen, kann dies dazu führen, dass Ihr Programm nicht mehr lesbar und nicht mehr wartbar ist und der Namespace mit allen von Ihnen importierten statischen Elementen verschmutzt wird. Leser Ihres Codes (einschließlich Sie, einige Monate nachdem Sie ihn geschrieben haben) wissen nicht, aus welcher Klasse ein statisches Mitglied stammt. Das Importieren aller statischen Elemente aus einer Klasse kann die Lesbarkeit besonders beeinträchtigen. Wenn Sie nur ein oder zwei Mitglieder benötigen, importieren Sie diese einzeln. Bei sachgemäßer Verwendung kann der statische Import Ihr Programm lesbarer machen.

xsl
quelle
28
Ich stimme den obigen Warnungen von @xsl voll und ganz zu. Ein Bereich, in dem es definitiv sehr nützlich ist, ist für junits Assert: Importieren Sie statische org.junit.Assert. * Für alle Ihre Unit-Tests.
BxlSofty
3
- zum Einfügen von sehr langen und nicht wirklich auffälligen Dokumentationsdateien, anstatt einfache Erklärungen zu schreiben.
Błażej Michalik
@xsl Soll sich der untere Teil des Beitrags in einem Anführungszeichenblock befinden? es sieht so aus, als hättest du es getippt.
Ferrybig
1
@Ferrybig: Es ist ein Zitat aus der verlinkten Dokumentation.
Joshua Snider
Es ist wie includein Ruby!
Chloe
227

Es gibt keinen Unterschied zwischen den beiden von Ihnen angegebenen Importen. Sie können jedoch den statischen Import verwenden, um uneingeschränkten Zugriff auf statische Mitglieder anderer Klassen zu ermöglichen. Wo ich das früher machen musste:

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

Ich kann dies tun:

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

Weitere Informationen finden Sie in der Dokumentation .

Sieger
quelle
57

Der statische Import wird verwendet, um statische Felder / Methoden einer Klasse zu importieren, anstatt:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

Du kannst schreiben :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

Dies ist nützlich, wenn Sie häufig eine Konstante aus einer anderen Klasse in Ihrem Code verwenden und der statische Import nicht mehrdeutig ist.

Übrigens, in Ihrem Beispiel "statische org.example.Myclass importieren;" funktioniert nicht: import ist für die Klasse, import static ist für statische Mitglieder einer Klasse.

Nicolas
quelle
37

Die Grundidee des statischen Imports besteht darin, dass Sie eine statische Klasse, eine statische Variable oder eine Aufzählung immer dann importieren können, wenn Sie eine statische Klasse, eine statische Variable oder eine Aufzählung verwenden.

Ich werde meinen Standpunkt anhand eines Beispiels erläutern.

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));
 }
}

Gleicher Code mit statischen Importen:

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));
  }
}

Hinweis : Der statische Import kann das Lesen Ihres Codes verwirren.

Rahul Saxena
quelle
4
Würde es etwas bedeuten, import static java.lang.Mathohne das Sternchen zu schreiben ?
Chris Middleton
1
@AmadeusDrZaius Nein, statischer Import ist nur für statische Mitglieder einer Klasse.
Harry
1
Gute Antwort! Da viele "Neulinge" diesen Beitrag lesen, sollte man jedoch eine kleine Warnung geben: Verwenden Sie das Sternchen nicht zu häufig, um eine Verschmutzung des Namespace zu verhindern.
goerlibe
24

der Unterschied zwischen "statische com.showboy.Myclass importieren" und "com.showboy.Myclass importieren"?

Der erste sollte einen Compilerfehler generieren, da der statische Import nur zum Importieren von Feldern oder Elementtypen funktioniert. (vorausgesetzt, MyClass ist keine innere Klasse oder ein Mitglied von Showboy)

Ich denke du meintest

import static com.showboy.MyClass.*;

Dadurch werden alle statischen Felder und Mitglieder von MyClass in der eigentlichen Kompilierungseinheit verfügbar, ohne dass sie qualifiziert werden müssen ... wie oben erläutert

user85421
quelle
14

Das importerlaubt es den Java - Programmierer Zugriff Klassen eines Pakets ohne Paket Qualifikation.

Die static importFunktion ermöglicht den Zugriff auf die statischen Mitglieder einer Klasse ohne die Klassenqualifikation.

Das importbietet Zugriff auf Klassen und Schnittstellen, während es static importZugriff auf statische Mitglieder der Klasse bietet.

Beispiel:

Mit Import

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

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

  }   
} 

Mit statischem Import

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

 }   
} 

Siehe auch: Was ist statischer Import in Java 5?

Roottraveller
quelle
2

Angenommen , Sie haben statische Felder und Methoden innerhalb einer Klasse genannt MyClassin einem Paket mit dem Namen myPackageund Sie wollen , dass sie durch die Eingabe direkt zugreifen myStaticFieldoder myStaticMethodohne jedes Mal eingeben MyClass.myStaticFieldoderMyClass.myStaticMethod .

Hinweis: Sie müssen ein import myPackage.MyClass oder myPackage.* ausführen, um auf die anderen Ressourcen zuzugreifen

Java Main
quelle
1

Der staticModifikator danach importdient zum Abrufen / Verwenden statischer Felder einer Klasse. Ein Bereich, in dem ich import staticKonstanten aus einer Klasse abrufe. Wir können auch import staticstatische Methoden anwenden . Stellen Sie sicher, dass Sie eingeben, import staticda dies static importfalsch ist.

Was ist static importin Java - JavaRevisited - Eine sehr gute Ressource, um mehr darüber zu erfahrenimport static.

RajeeV VenkaT
quelle