Co oznacza modyfikator „statyczny” po „imporcie”?

438

Przy takim użyciu:

import static com.showboy.Myclass;

public class Anotherclass{}

Jaka jest różnica między import static com.showboy.Myclassi import com.showboy.Myclass?

JSON
źródło

Odpowiedzi:

390

Zobacz dokumentację

Statyczna deklaracja importowa jest analogiczna do zwykłej deklaracji importowej. W przypadku gdy normalna deklaracja importowa importuje klasy z paczek, umożliwiając ich stosowanie bez kwalifikacji paczki, statyczna deklaracja importowa importuje statyczne elementy z klas, umożliwiając ich stosowanie bez kwalifikacji klasy.

Kiedy więc należy użyć importu statycznego? Bardzo oszczędnie! Używaj go tylko wtedy, gdy masz ochotę zadeklarować lokalne kopie stałych lub nadużyć dziedziczenia (Antipattern interfejsu stałego). Innymi słowy, używaj go, gdy potrzebujesz częstego dostępu do elementów statycznych z jednej lub dwóch klas. Jeśli nadużyjesz funkcji importowania statycznego, może to spowodować, że Twój program będzie nieczytelny i niemożliwy do utrzymania, zanieczyszczając jego przestrzeń nazw wszystkimi importowanymi elementami statycznymi. Czytelnicy twojego kodu (w tym ciebie, kilka miesięcy po napisaniu go) nie będą wiedzieć, z której klasy pochodzi element statyczny. Importowanie wszystkich elementów statycznych z klasy może być szczególnie szkodliwe dla czytelności; jeśli potrzebujesz tylko jednego lub dwóch członków, zaimportuj ich indywidualnie. Odpowiednio użyte importowanie statyczne może uczynić twój program bardziej czytelnym,

xsl
źródło
28
Całkowicie zgadzam się z powyższymi ostrzeżeniami @xsl. Jednym z obszarów, w którym jest to bardzo przydatne, jest Assert : import static org.junit.Assert. * Dla wszystkich testów jednostkowych.
BxlSofty
3
- do kontrolnego wklejania bardzo długiego i niezbyt przyciągającego wzrok pliku dokumentacji, zamiast pisania prostych wyjaśnień.
Błażej Michalik,
@xsl Czy dolna część postu powinna znajdować się w bloku cytatu? wygląda na to, że go wpisałeś.
Ferrybig,
1
@ Ferrybig: To cytat z dołączonej dokumentacji.
Joshua Snider,
To jest jak includew Ruby!
Chloe
227

Nie ma różnicy między tymi dwoma importami, które podajesz. Możesz jednak użyć importu statycznego, aby zezwolić na nieograniczony dostęp do statycznych elementów innych klas. Gdzie kiedyś musiałem to robić:

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

Mogę to zrobić:

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

Możesz zobaczyć więcej w dokumentacji .

Zwycięzca
źródło
57

Import statyczny służy do importowania pól statycznych / metody klasy zamiast:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

Możesz pisać :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

Jest to przydatne, jeśli często używasz stałej z innej klasy w kodzie i jeśli import statyczny nie jest niejednoznaczny.

Btw, w twoim przykładzie „import static org.example.Myclass;” nie działa: import jest dla klasy, import statyczny jest dla statycznych członków klasy.

Nicolas
źródło
37

Podstawową ideą importu statycznego jest to, że za każdym razem, gdy używasz klasy statycznej, zmiennej statycznej lub wyliczenia, możesz je zaimportować i uchronić się przed wpisaniem.

Omówię tę kwestię przykładem.

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

Ten sam kod ze statycznym importem:

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

Uwaga : import statyczny może powodować, że kod może być mylący z czytaniem.

Rahul Saxena
źródło
4
Czy pisanie import static java.lang.Mathbez gwiazdki oznaczałoby cokolwiek ?
Chris Middleton
1
@AmadeusDrZaius nie, import statyczny jest tylko dla statycznych członków klasy.
Harry
1
Dobra odpowiedź! Ponieważ wielu początkujących czytało ten post, należy jednak dać jedno małe ostrzeżenie: nie należy nadużywać gwiazdki, aby zapobiec zanieczyszczeniu przestrzeni nazw.
goerlibe 30.04.17
24

różnica między „import static com.showboy.Myclass” i „import com.showboy.Myclass”?

Pierwszy powinien wygenerować błąd kompilatora, ponieważ import statyczny działa tylko w przypadku importowania pól lub typów elementów. (zakładając, że MyClass nie jest wewnętrzną klasą ani członkiem showboya)

Myślę, że miałeś na myśli

import static com.showboy.MyClass.*;

która udostępnia wszystkie pola statyczne i elementy z MyClass w rzeczywistej jednostce kompilacji bez konieczności ich kwalifikowania ... jak wyjaśniono powyżej

użytkownik85421
źródło
14

importPozwala programiście Java klas dostępowych z pakietem bez pakietu kwalifikacji.

Ta static importfunkcja umożliwia dostęp do statycznych elementów klasy bez kwalifikacji klasy.

importZapewnia dostęp do klas i interfejs natomiast static importzapewnia dostęp do statycznych członków klasy.

Przykład:

Z importem

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

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

  }   
} 

Ze statycznym importem

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

 }   
} 

Zobacz także: Co to jest import statyczny w Javie 5

roottraveller
źródło
2

Załóżmy, że masz pola statyczne i metody wewnątrz klasy o nazwie MyClasswewnątrz pakietu o nazwie myPackagei chcesz uzyskać do nich bezpośredni dostęp, wpisując myStaticFieldlub myStaticMethodbez wpisywania za każdym razem MyClass.myStaticFieldlubMyClass.myStaticMethod .

Uwaga: musisz zrobić import myPackage.MyClass lub, myPackage.* aby uzyskać dostęp do innych zasobów

Java Main
źródło
1

The staticModyfikator po importto do pobierania / używanie statycznych pól klasy. Jednym z obszarów, w których używam, import staticjest pobieranie stałych z klasy. Możemy również stosować import staticmetody statyczne. Upewnij się, że wpisałeś, import staticponieważ static importjest niepoprawny.

Co jest static importw Javie - JavaRevisited - Bardzo dobry zasób, aby dowiedzieć się więcej import static.

RajeeV VenkaT
źródło