2008-10-02 4 views

ответ

306

См Documentation

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

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

+19

Я полностью согласен с приведенными выше предупреждениями @xsl. Одна из областей, где она определенно очень полезна, предназначена для Assert junit: _import static org.junit.Assert. * _ Для всех ваших модульных тестов. – 2014-01-18 11:58:53

+3

- для управления склеиванием очень длинный и не очень привлекательный файл документации, вместо написания простого объяснения. – 2015-10-23 16:43:26

48

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

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; 

} 

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

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

182

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

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

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

21

разница между "импорта статической com.showboy.Myclass" и «импорта com.showboy.Myclass «?

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

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

import static com.showboy.MyClass.*; 

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

32

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

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

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

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

2

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

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

12

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

} 
} 

См. Также: What is static import in Java 5

1

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

What is static import in Java - JavaRevisited - Очень хороший ресурс, чтобы узнать больше о import static.