Что означает модификатор «static» после «import»?


438

При использовании так:

import static com.showboy.Myclass;

public class Anotherclass{}

какая разница между import static com.showboy.Myclassа import com.showboy.Myclass?

Ответы:


390

Смотрите документацию

Статическое объявление импорта аналогично обычному объявлению импорта. Если обычное объявление импорта импортирует классы из пакетов, что позволяет использовать их без квалификации пакета, статическое объявление импорта импортирует статические члены из классов, что позволяет использовать их без квалификации класса.

Итак, когда вы должны использовать статический импорт? Очень экономно! Используйте его только тогда, когда у вас возникнет искушение объявить локальные копии констант или злоупотребить наследованием (Антипаттерн Constant Interface). Другими словами, используйте его, когда вам требуется частый доступ к статическим членам одного или двух классов. Если вы чрезмерно используете функцию статического импорта, она может сделать вашу программу нечитаемой и не поддерживаемой, загрязняя ее пространство имен всеми статическими элементами, которые вы импортируете. Читатели вашего кода (включая вас через несколько месяцев после того, как вы его написали) не будут знать, из какого класса происходит статический член. Импорт всех статических членов из класса может быть особенно вредным для читабельности; если вам нужен только один или два участника, импортируйте их по отдельности. При правильном использовании статический импорт может сделать вашу программу более читабельной,


28
Я полностью согласен с приведенными выше предупреждениями @xsl. Одна из областей, где он определенно очень полезен, - это использование Asit в junit: импорт статического org.junit.Assert. * Для всех ваших юнит-тестов.
BxlSofty

3
- для контроля вставки очень длинного и не очень привлекательного файла документации, вместо написания простого объяснения.
Błażej Michalik

@xsl Должна ли нижняя часть сообщения находиться в блоке цитат? Похоже, вы набрали его.
Ferrybig

1
@Ferrybig: Это цитата из связанной документации.
Джошуа Снайдер

Это как includeв Ruby!
Хлоя

227

Нет никакой разницы между этими двумя типами импорта. Однако вы можете использовать статический импорт, чтобы разрешить неквалифицированный доступ к статическим членам других классов. Где я раньше делал это:

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

Я могу сделать это:

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

Вы можете увидеть больше в документации .


57

Статический импорт используется для импорта статических полей / метода класса вместо:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

Ты можешь написать :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

Это полезно, если вы часто используете константу из другого класса в своем коде и если статический импорт не является неоднозначным.

Кстати, в вашем примере "import static org.example.Myclass;" не сработает: импорт для класса, импорт статический для статических членов класса.


37

Основная идея статического импорта заключается в том, что всякий раз, когда вы используете статический класс, статическую переменную или перечисление, вы можете импортировать их и избавить себя от некоторой типизации.

Я поясню свою точку зрения на примере.

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

Тот же код со статическим импортом:

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

Примечание : статический импорт может затруднить чтение кода.


4
Будет ли что-нибудь писать import static java.lang.Mathбез звездочки?
Крис Миддлтон

1
@AmadeusDrZaius Нет, импорт статический только для статических членов класса.
Гарри

1
Хороший ответ! Поскольку многие «новички» читают этот пост, следует сделать одно маленькое предупреждение: не злоупотребляйте звездочкой, чтобы предотвратить загрязнение пространства имен.
goerlibe

24

чем разница между "import static com.showboy.Myclass" и "import com.showboy.Myclass"?

Первый должен генерировать ошибку компилятора, так как статический импорт работает только для импорта полей или типов элементов. (при условии, что MyClass не является внутренним классом или членом showboy)

Я думаю ты имел ввиду

import static com.showboy.MyClass.*;

который делает все статические поля и члены из MyClass доступными в фактическом модуле компиляции без необходимости их квалифицировать ... как объяснено выше


14

importПозволяет Java программисту классов доступа пакета без пакета квалификации.

static importФункция позволяет получить доступ к членам статики класса без квалификации класса.

importПредоставляет доступ к классам и интерфейс , тогда как static importобеспечивает доступ к статическим членам класса.

Пример :

С импортом

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

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

  }   
} 

Со статическим импортом

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

 }   
} 

Смотрите также: Что такое статический импорт в Java 5


2

Скажем, у вас есть статические поля и методы внутри класса, вызываемого MyClassвнутри вызываемого пакета, myPackageи вы хотите получить к ним доступ напрямую, печатая myStaticFieldили myStaticMethodне вводя каждый раз MyClass.myStaticFieldили MyClass.myStaticMethod.

Примечание: вам нужно сделать import myPackage.MyClass или myPackage.* для доступа к другим ресурсам


1

staticМодификатор после того, как importдля извлечения / с использованием статических полей класса. Одна область, в которой я использую, import static- для извлечения констант из класса. Мы также можем применять import staticстатические методы. Убедитесь, что напечатали, import staticпотому что static importэто неправильно.

Что находится static importв Java - JavaRevisited - очень хороший ресурс, чтобы узнать больше оimport static.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.