¿Qué significa el modificador "estático" después de "importar"?

438

Cuando se usa así:

import static com.showboy.Myclass;

public class Anotherclass{}

¿Cuál es la diferencia entre import static com.showboy.Myclassy import com.showboy.Myclass?

JSON
fuente

Respuestas:

390

Ver documentación

La declaración de importación estática es análoga a la declaración de importación normal. Cuando la declaración de importación normal importa clases de paquetes, lo que permite su uso sin calificación de paquete, la declaración de importación estática importa miembros estáticos de clases, lo que permite su uso sin calificación de clase.

Entonces, ¿cuándo deberías usar la importación estática? Muy escasamente! Úselo solo cuando de lo contrario estaría tentado a declarar copias locales de constantes o abusar de la herencia (el antipatrón de interfaz constante). En otras palabras, úselo cuando requiera acceso frecuente a miembros estáticos de una o dos clases. Si usa en exceso la función de importación estática, puede hacer que su programa sea ilegible e imposible de mantener, contaminando su espacio de nombres con todos los miembros estáticos que importe. Los lectores de su código (incluido usted, unos meses después de que lo escribió) no sabrán de qué clase proviene un miembro estático. Importar todos los miembros estáticos de una clase puede ser particularmente dañino para la legibilidad; Si solo necesita uno o dos miembros, impórtelos individualmente. Utilizado adecuadamente, la importación estática puede hacer que su programa sea más legible,

xsl
fuente
28
Estoy completamente de acuerdo con las advertencias anteriores de @xsl. Un área en la que definitivamente es muy útil es para Assert de Junit: importe org.junit.Assert. * Estático para todas sus pruebas unitarias.
BxlSofty
3
- para controlar el pegado de archivos de documentación muy largos y no realmente llamativos, en lugar de escribir explicaciones simples.
Błażej Michalik
@xsl ¿Se supone que la parte inferior de la publicación está en un bloque de presupuesto? parece que lo escribiste.
Ferrybig
1
@Ferrybig: Es una cita de la documentación vinculada.
Joshua Snider
¡Es como includeen Ruby!
Chloe
227

No hay diferencia entre esas dos importaciones que declaras. Sin embargo, puede usar la importación estática para permitir el acceso no calificado a miembros estáticos de otras clases. Donde solía hacer esto:

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

Puedo hacer esto:

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

Puedes ver más en la documentación .

Víctor
fuente
57

La importación estática se utiliza para importar campos / métodos estáticos de una clase en lugar de:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

Puedes escribir :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

Es útil si a menudo usa una constante de otra clase en su código y si la importación estática no es ambigua.

Por cierto, en su ejemplo "import static org.example.Myclass;" no funcionará: la importación es para la clase, la importación estática es para los miembros estáticos de una clase.

Nicolas
fuente
37

La idea básica de la importación estática es que siempre que esté utilizando una clase estática, una variable estática o una enumeración, puede importarlos y ahorrarse algo de tipeo.

Elaboraré mi punto con el ejemplo.

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

Mismo código, con importaciones estáticas:

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

Nota : la importación estática puede hacer que su código sea confuso de leer.

Rahul Saxena
fuente
44
¿Significaría algo escribir import static java.lang.Mathsin el asterisco?
Chris Middleton
1
@AmadeusDrZaius no, importar estática es solo para miembros estáticos de una clase.
Harry
1
¡Buena respuesta! Dado que muchos 'novatos' leen esta publicación, sin embargo, se debe dar una pequeña advertencia: no use en exceso el asterisco para evitar la contaminación del espacio de nombres.
goerlibe
24

¿Cuál es la diferencia entre "import static com.showboy.Myclass" e "import com.showboy.Myclass"?

El primero debería generar un error de compilación ya que la importación estática solo funciona para importar campos o tipos de miembros. (suponiendo que MyClass no sea una clase interna o miembro de showboy)

Creo que quisiste decir

import static com.showboy.MyClass.*;

lo que hace que todos los campos estáticos y miembros de MyClass estén disponibles en la unidad de compilación real sin tener que calificarlos ... como se explicó anteriormente

usuario85421
fuente
14

El importpermite al programador de Java para las clases de acceso de un paquete sin cualificación paquete.

La static importcaracterística permite acceder a los miembros estáticos de una clase sin la calificación de clase.

El importproporciona acceso a clases y la interfaz mientras que static importproporciona acceso a miembros estáticos de la clase.

Ejemplo:

Con importación

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

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

  }   
} 

Con importación estática

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

 }   
} 

Consulte también: ¿Qué es la importación estática en Java 5?

roottraveller
fuente
2

Supongamos que tiene campos y métodos estáticos dentro de una clase llamada MyClassdentro de un paquete llamado myPackagey desea acceder a ellos directamente escribiendo myStaticFieldo myStaticMethodsin escribir cada vez MyClass.myStaticFieldoMyClass.myStaticMethod .

Nota: debe hacer un import myPackage.MyClass o myPackage.* para acceder a los otros recursos

Java principal
fuente
1

El staticmodificador posterior importes para recuperar / usar campos estáticos de una clase. Un área en la que uso import statices para recuperar constantes de una clase. También podemos aplicar import staticsobre métodos estáticos. Asegúrese de escribir import staticporque static importestá mal.

Qué hay static importen Java - JavaRevisited - Un muy buen recurso para saber másimport static.

RajeeV VenkaT
fuente