O que significa o modificador "estático" após a "importação"?

438

Quando usado assim:

import static com.showboy.Myclass;

public class Anotherclass{}

qual é a diferença entre import static com.showboy.Myclasse import com.showboy.Myclass?

JSON
fonte

Respostas:

390

Ver documentação

A declaração de importação estática é análoga à declaração de importação normal. Onde a declaração de importação normal importa classes de pacotes, permitindo que sejam usadas sem qualificação de pacote, a declaração de importação estática importa membros estáticos de classes, permitindo que sejam usados ​​sem qualificação de classe.

Então, quando você deve usar a importação estática? Muito com moderação! Use-o apenas quando estiver tentado a declarar cópias locais de constantes ou a abusar da herança (o Antipadrão da interface constante). Em outras palavras, use-o quando precisar de acesso frequente a membros estáticos de uma ou duas classes. Se você usar demais o recurso de importação estática, ele poderá tornar seu programa ilegível e impossível de manter, poluindo seu espaço de nome com todos os membros estáticos importados. Os leitores do seu código (incluindo você, alguns meses depois de escrevê-lo) não saberão de qual classe um membro estático vem. A importação de todos os membros estáticos de uma classe pode ser particularmente prejudicial à legibilidade; se você precisar de apenas um ou dois membros, importe-os individualmente. Quando usada adequadamente, a importação estática pode tornar seu programa mais legível,

xsl
fonte
28
Concordo plenamente com os avisos acima do @xsl. Uma área em que é definitivamente muito útil é o Assit de junit: importe org.junit.Assert. * Estático para todos os seus testes de unidade.
precisa saber é o seguinte
3
- para colar de controle arquivos de documentação muito longos e não muito atraentes, em vez de escrever explicações simples.
Błażej Michalik
@xsl A parte inferior da postagem deveria estar em um bloco de cotação? parece que você digitou.
Ferrybig
1
@Ferrybig: É uma citação da documentação vinculada.
19376 Joshua Snider
É como includeem Ruby!
Chloe
227

Não há diferença entre essas duas importações que você declara. No entanto, você pode usar a importação estática para permitir acesso não qualificado a membros estáticos de outras classes. Onde eu costumava fazer isso:

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

Eu posso fazer isso:

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

Você pode ver mais na documentação .

Vencedor
fonte
57

A importação estática é usada para importar campos / métodos estáticos de uma classe em vez de:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

Você pode escrever :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

É útil se você costuma usar uma constante de outra classe no seu código e se a importação estática não é ambígua.

Btw, no seu exemplo "import static.example.Myclass static;" não funcionará: a importação é para classe, a importação estática é para membros estáticos de uma classe.

Nicolas
fonte
37

A idéia básica da importação estática é que sempre que você estiver usando uma classe estática, uma variável estática ou uma enumeração, você poderá importá-las e poupar a digitação.

Vou elaborar meu argumento com exemplo.

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

Mesmo código, com importações 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 : a importação estática pode tornar seu código confuso para leitura.

Rahul Saxena
fonte
4
Significaria alguma coisa para escrever import static java.lang.Mathsem o asterisco?
Chris Middleton
1
@AmadeusDrZaius não, a importação estática é apenas para membros estáticos de uma classe.
Harry
1
Boa resposta! Como muitos 'novatos' leem este post, no entanto, deve-se dar um pequeno aviso: Não use demais o asterisco para evitar a poluição do espaço para nome.
precisa saber é
24

a diferença entre "importar estático com.showboy.Myclass" e "importar com.showboy.Myclass"?

O primeiro deve gerar um erro do compilador, pois a importação estática funciona apenas para importar campos ou tipos de membros. (supondo que MyClass não seja uma classe interna ou membro do showboy)

Eu acho que você quis dizer

import static com.showboy.MyClass.*;

que disponibiliza todos os campos e membros estáticos do MyClass na unidade de compilação real sem precisar qualificá-los ... como explicado acima

user85421
fonte
14

Isso importpermite que o programador java acesse as classes de um pacote sem qualificação do pacote.

O static importrecurso permite acessar os membros estáticos de uma classe sem a qualificação da classe.

O importfornece acessibilidade para classes e interface, enquanto static importfornece acessibilidade para membros estáticos da classe.

Exemplo:

Com importação

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

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

  }   
} 

Com importação 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 também: O que é importação estática no Java 5

roottraveller
fonte
2

Digamos que você tenha campos e métodos estáticos dentro de uma classe chamada MyClassdentro de um pacote chamado myPackagee deseje acessá-los diretamente digitando myStaticFieldou myStaticMethodsem digitar cada vez MyClass.myStaticFieldouMyClass.myStaticMethod .

Nota: você precisa fazer um import myPackage.MyClass ou myPackage.* para acessar os outros recursos

Java Principal
fonte
1

O staticmodificador a seguir importé para recuperar / usar campos estáticos de uma classe. Uma área na qual eu uso import staticé para recuperar constantes de uma classe. Também podemos aplicar import staticem métodos estáticos. Certifique-se de digitar import staticporque static importestá errado.

O que há static importem Java - JavaRevisited - Um recurso muito bom para saber maisimport static.

RajeeV VenkaT
fonte