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

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

import static com.showboy.Myclass;

public class Anotherclass{}

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


person JSON    schedule 02.10.2008    source источник


Ответы (9)


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

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

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

person xsl    schedule 02.10.2008
comment
Я полностью согласен с предупреждениями @xsl выше. Одна из областей, где это определенно очень полезно, - это assert от junit: import static org.junit.Assert. * для всех ваших модульных тестов. - person BxlSofty; 18.01.2014
comment
- для контрольной вставки очень длинного и не очень привлекательного файла документации вместо написания простых пояснений. - person Błażej Michalik; 23.10.2015
comment
@xsl Нижняя часть сообщения должна быть в блоке цитаты? похоже, вы это набрали. - person Ferrybig; 19.02.2016
comment
@Ferrybig: это цитата из связанной документации. - person Joshua Snider; 20.02.2016
comment
Это похоже на include в Ruby! - person Chloe; 25.10.2018

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

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

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

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

Дополнительную информацию можно найти в документации. .

person Victor    schedule 02.10.2008

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

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;» не будет работать: импорт для класса, статический импорт для статических членов класса.

person Nicolas    schedule 02.10.2008

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

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

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

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

person Rahul Saxena    schedule 19.09.2012
comment
Будет ли что-нибудь значить писать import static java.lang.Math без звездочки? - person Chris Middleton; 26.02.2014
comment
@AmadeusDrZaius нет, статический импорт предназначен только для статических членов класса. - person Harry; 11.01.2015
comment
Хороший ответ! Поскольку многие «новички» читают этот пост, тем не менее, следует сделать одно небольшое предупреждение: Не злоупотребляйте звездочкой, чтобы предотвратить загрязнение пространства имен. - person goerlibe; 30.04.2017

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

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

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

import static com.showboy.MyClass.*;

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

person user85421    schedule 14.10.2009

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

person roottraveller    schedule 31.01.2016

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

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

person Java Main    schedule 22.12.2015

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

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

person RajeeV VenkaT    schedule 09.06.2016