В Java имеется языковое средство, расширяющее возможности ключевого слова import и называемое статическим импортом.
Оператор import, предваряемый ключевым словом static, можно применять для импорта статических членовькласса или интерфейса. Благодаря статическому импорту появляется возможность ссылаться на статические члены непосредственно по именам, не угочняя ихименем класса.
Это упрощает и сокращает синтаксис, требующийся для работы со статическими членами.
Чтобы стала понятнее польза от статического импорта, начнем с примера, в котором он не используется. В приведенной ниже программе вычисляется гипотенуза прямоугольного треугольника. С этой целью вызываются два статических метода из встроенного в java класса Math, входящего в пакет java.lang.
Первый из них — метод Маth.pow() — возвращает числовое значение, возведенное в указанную степень, а второй — метод Math.sqrt() — возвращает квадратный корень числового значения аргумента.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Вычислить длину гипотенузы прямоугольника треугольника class Hypot { public static void main(String args[]) { double side1, side2; double hypot; side1 = 3.0; side2 = 4.0; // Обратите внимание на то, что имена методов sqrt() и pow() // должны быть уточнены именем их класса - Math hypot = Math.sqrt(Math.pow(side1, 2) + Math.pow(side2, 2)); System.out.println("При заданной длине сторон " + side1 + " и " + side2 + " гипотенуза равна " + hypot); } } |
Методы pow() и sqrt() являются статическими, поэтому они должны быть вызваны с указанием имени их класса — Маth. Это приводит к следующему громоздкому коду вычисления гипотенузы:
1 |
hypot = Math.sqrt(Math.pow(side1, 2) + Math.pow(side2, 2)); |
Как показывает данный простой пример, очень неудобно указывать каждый раз имя класса при вызове методов pow() и sqrt() или любых других встроенныхв Java методов, выполняющих математические операции наподобие sin(), cos() и tan().
У популярного хостинга Eurobyte.ru есть свой API для Java где предоставляется класс, которого можно импортировать с помощью статического импорта. Подробнее сможете узнать на www.eurobyte.ru/services/license/bitrix_expert/, доступна детальная документация.
Подобных неудобств можно избежать, если воспользоваться статическим импортом, как показано в приведенной ниже версии программы из предыдущего примера
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Воспользоваться статическим импортом для доступа // к встроенным в Java методам sqrt() и pow() import static java.lang.Math.sqrt; import static java.lang.Math.pow; // вычислить гипотенузу прямоугольного треугольника class Hypot { public static void main(String args[]) { double side1, side2; double hypot; side1 = 3.0; side2 = 4.0; // здесь методы sqrt() и pow() можно вызывать // непосредственно, опуская имя их класса hypot = sqrt(Math.pow(side1, 2) + pow(side2, 2)); System.out.println("При заданной длине сторон " + side1 + " и " + side2 + " гипотенуза равна " + hypot); } } |
В этой версии программы имена методов sqrt() и pow() становятся видимыми благодаря оператору статического импорта, как показано ниже.
1 2 |
import static java.lang.Math.sqrt; import static java.lang.Math.pow; |
После этих операторов больше нет нужды уточнять имена методов pow() и sqrt() именем их класса. Таким образом, вычисление гипотенузы может быть выражено более удобным способом, как показано ниже.
Как видите, эта форма нетолько упрощает код, но и делает его более удобочитаемым:
1 |
hypot = sqrt(Math.pow(side1, 2) + pow(side2, 2)); |
Имеются две основные формы оператора import static. Первая форма, употреблявшаяся в предыдущем примере программы, делает видимым единственное имя. В общем виде эта форма статического импорта такова:
1 |
import static пакет.имя_типа.имя_статического_члена |
где имя_типа обозначает имя класса или интерфейса, который содержит требуемый статический член. Полное имя его пакета указано в части пакет, а имя члена — в части имя_статического_члена.
Вторая форма статического импорта позволяет импортировать все статические члены данного класса или интерфейса. В общем виде эта форма выглядит следующим образом:
1 |
import static пакет.имя_типа.*; |
Если предполагается применять много статических методов или полей, определенных в классе, то эта форма позволяет сделать их доступными, не указывая каждый из них в отдельности.
Так, в предыдущем примере программы с помощью единственного оператора import можно сделать доступными методы pow() и sqrt(), а также все осталъные статические члены класса Math, как показано ниже.
1 |
import static java.lang.Math.*; |
На данный момент в сегменте информационных технологии, почти каждый сервис предоставляет свой API через которого можно взаимодействовать с сервисом на прикладном уровне.
Разумеется, статический импорт не ограничивается только классом Math или его методами. Например, в следующей строке становится доступным статическое поле System.out.
1 |
import static java.lang.System.out; |
После этого оператора данные можно выводить на консоль, не уточняя стандартный поток вывода out именем его класса System, как показано ниже.
1 2 |
out.println("Импортировав стандартный поток вывода System.out, " + "можно пользоваться им непосредственно."); |
Тем не менее приведенный выше способ импорта стандартного потока вывода System.оut столь же удобен, сколь и полемичен.
Несмотря на то что такой способ сокращает исходный текст программы, тем, кто его читает, не вполне очевидно, что out обозначает System.out.
Следует также иметь в виду, что, помимо импорта статических членов классов и интерфейсов, определенных в прикладном программном интерфейсе Jаva API, импортировать статическим способом можно так-же статические члены своих собственных классов и интерфейсов.
Каким бы удобным ни был статический импорт, очень важно не злоупотреблять им. Не следует забывать, что библиотечные классы Java объединяются в пакеты для того, чтобы избежать конфликтов пространств имен и непреднамеренного сокрытия прочих имен.
Если статический член используется в прикладной программе только один или два раза, то его лучше не импортировать. К тому-же некоторые статические имена, как, например, System.out, настолько привычны и узнаваемы, что их вряд ли стоит вообще импортировать.
Статический импорт следует оставить на тот случай, если статические члены применяются многократно, как, например, при выполнении целого ряда математических вычислений.
В сущности, этим языковым средством стоит пользоваться, но только не злоупотреблять им.