479 Stimmen

Was bedeutet der Modifikator "static" nach "import"?

Wenn sie so verwendet wird:

import static com.showboy.Myclass;

public class Anotherclass{}

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

417voto

xsl Punkte 16574

Voir Dokumentation

Die statische Importdeklaration ist analog zur normalen Import Deklaration. Während die normale import Deklaration Klassen aus Paketen importiert, so dass sie verwendet werden können ohne Paketqualifikation verwendet werden können, ist die statische Import-Deklaration statische Mitglieder von Klassen, so dass sie ohne Klasse verwendet werden Qualifikation.

Wann sollten Sie also statische Importe verwenden? Sehr sparsam! Verwenden Sie ihn nur, wenn Sie sonst versucht wären, lokale Kopien von Konstanten zu deklarieren Kopien von Konstanten zu deklarieren, oder die Vererbung zu missbrauchen (das Constant Interface Antipattern). Mit anderen Worten, verwenden Sie es wenn Sie einen häufigen Zugriff auf statische Mitglieder von einer oder zwei Klassen benötigen. Wenn Sie die statische Importfunktion übermäßig nutzen, kann sie Ihr Programm unlesbar und unwartbar machen, indem es seinen Namensraum mit all den statischen Mitgliedern, die Sie importieren. Die Leser von Ihres Codes (einschließlich Ihnen, ein paar Monate nachdem Sie ihn geschrieben haben) werden nicht wissen aus welcher Klasse ein statisches Mitglied stammt stammt. Das Importieren aller statischen Mitglieder aus einer Klasse kann besonders schädlich für die Lesbarkeit sein; wenn Sie nur ein oder zwei Mitglieder benötigen, importieren Sie sie einzeln. Verwendet richtig eingesetzt, kann der statische Import die Ihr Programm lesbarer machen, indem die Wiederholung von Klassennamen von Klassennamen.

34 Stimmen

Ich stimme den obigen Warnungen von @xsl vollkommen zu. Ein Bereich, in dem es definitiv sehr nützlich ist, ist für junit's Assert: importieren static org.junit.Assert.* für alle Ihre Unit-Tests.

3 Stimmen

-- zur Kontrolle sehr lange und nicht wirklich auffällige Dokumentationsdateien einfügen, anstatt einfache Erklärungen zu schreiben.

0 Stimmen

@xsl Soll der untere Teil des Beitrags in einem Anführungszeichen stehen? Es sieht so aus, als hätten Sie ihn getippt.

252voto

Victor Punkte 3255

Es gibt keinen Unterschied zwischen diesen beiden von Ihnen genannten Einfuhren. Sie können jedoch den statischen Import verwenden, um unqualifizierten Zugriff auf statische Mitglieder anderer Klassen zu ermöglichen. Früher musste ich das tun:

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

Ich kann das tun:

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

Weitere Informationen finden Sie in der Dokumentation .

61voto

Nicolas Punkte 23971

Statischer 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;

}

Sie können schreiben:

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

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

Btw, in Ihrem Beispiel "import static org.example.Myclass;" wird nicht funktionieren: import ist für Klasse, import static ist für statische Mitglieder einer Klasse.

40voto

Rahul Saxena Punkte 657

Der Grundgedanke des statischen Imports besteht darin, dass Sie, wann immer Sie eine statische Klasse, eine statische Variable oder ein Enum verwenden, diese importieren können und sich damit einige Tipparbeit ersparen.

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 : Statischer Import kann Ihren Code unübersichtlich machen.

5 Stimmen

Würde es etwas bedeuten, zu schreiben import static java.lang.Math ohne das Sternchen?

3 Stimmen

@AmadeusDrZaius nope, import static ist nur für statische Mitglieder einer Klasse.

2 Stimmen

Gute Antwort! Da viele "Neulinge" diesen Beitrag lesen, sollte man jedoch eine kleine Warnung aussprechen: Verwenden Sie das Sternchen nicht zu oft um eine Verschmutzung des Namensraums zu verhindern.

24voto

user85421 Punkte 28350

den Unterschied zwischen "import static com.showboy.Myclass" und "import com.showboy.Myclass"?

Die erste sollte einen Compilerfehler erzeugen, da der statische Import nur für den Import von Feldern oder Membertypen funktioniert. (vorausgesetzt, MyClass ist keine innere Klasse oder ein Mitglied von showboy)

Ich glaube, Sie meinten

import static com.showboy.MyClass.*;

was alle statischen Felder und Member von MyClass in der eigentlichen Kompilierungseinheit verfügbar macht, ohne dass sie qualifiziert werden müssen... wie oben erklärt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X