Статический импорт
Статический импорт — это функция, представленная в языке программирования Java , которая позволяет членам (полям и методам), которые были включены в их класс-контейнер, как public static
, который будет использоваться в коде Java без указания класса, в котором определено поле. Эта возможность была введена в язык в версии 5.0 .
Эта функция обеспечивает типобезопасный механизм включения констант в код без необходимости ссылки на класс, который первоначально определил поле. Это также помогает отказаться от практики создания константного интерфейса ( интерфейса , который определяет только константы с последующим написанием класса, реализующего этот интерфейс, что считается ненадлежащим использованием интерфейсов). [ 1 ] )
Этот механизм можно использовать для ссылки на отдельные члены класса:
import static java.lang.Math.PI;
import static java.lang.Math.pow;
или все статические члены класса:
import static java.lang.Math.*;
Например, этот класс:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println("Considering a circle with a diameter of 5 cm, it has");
System.out.println("a circumference of " + (Math.PI * 5) + " cm");
System.out.println("and an area of " + (Math.PI * Math.pow(2.5, 2)) + " sq. cm");
}
}
Вместо этого можно записать так:
import static java.lang.Math.*;
import static java.lang.System.out;
public class HelloWorld {
public static void main(String[] args) {
out.println("Hello World!");
out.println("Considering a circle with a diameter of 5 cm, it has");
out.println("a circumference of " + (PI * 5) + " cm");
out.println("and an area of " + (PI * pow(2.5, 2)) + " sq. cm");
}
}
Двусмысленность
[ редактировать ]Если два статических члена с одинаковым именем импортируются из нескольких разных классов, компилятор выдаст ошибку, поскольку он не сможет определить, какой член использовать, при отсутствии уточнения имени класса. Например, следующий код не сможет скомпилироваться:
import static java.lang.Integer.*;
import static java.lang.Long.*;
public class HelloWorld {
public static void main(String[] args) {
System.out.println(MAX_VALUE);
}
}
В этом случае, MAX_VALUE
является неоднозначным, поскольку MAX_VALUE
поле является атрибутом обоих java.lang.Integer
и java.lang.Long
. Добавление к полю префикса имени класса устранит неоднозначность класса, из которого MAX_VALUE
является производным, но при этом использование статического импорта становится излишним. [ 2 ]