Что означает & # 8220; статический & # 8221; модификатор после & # 8220; import & # 8221; имею в виду?

StackOverflow https://stackoverflow.com/questions/162187

  •  03-07-2019
  •  | 
  •  

Вопрос

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

import static com.showboy.Myclass;

public class Anotherclass{}

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

Это было полезно?

Решение

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

  

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

     

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

Другие советы

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

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

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

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

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

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

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;

}

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

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

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

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

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

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

  

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

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

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

import static com.showboy.MyClass.*;

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top