Новое средство,
которое многие программисты сочтут весьма полезным, называется статическим импортом (static import) и расширяет возможности ключевого слова import. Оператор языка
import, снабженный
ключевым словом static, следующим за ключевым словом import, может применяться для импорта
статических членов класса или интерфейса. Благодаря наличию статического импорта стало возможным ссылаться на статические члены непосредственно по их именам без уточнения
имени их класса. Это упрощает и
сокращает синтаксис обращения к статическому члену. Для того чтобы
понять пользу статического импорта, начнем с примера, в котором это средство не
применяется.
Пример
class Hypot { public static void main(String args[]) { double side1, side2; double hypot;
side1 = 3.0; side2 = 4.0;
hypot = Math.sqrt(Math.pow(side1, 2) +
Math.pow(side2, 2));
System.out.println("Given sides of
lengths " +
side1 + " and
" + side2 +
" the hypotenuse is
" +
hypot); } }
Поскольку pow() и sqrt() — статические
методы, они должны вызываться с использованием имени их класса, Math. Это приводит к
довольно громоздкому вычислению гипотенузы, приведенному в следующем фрагменте: hypot =
Math.sqrt(Math.pow(side1, 2) + Math.pow(side2, 2)); Как показывает этот
простой пример, необходимость указания имени класса при каждом обращении к методам
pow() и sqrt() (или к любому
другому математическому методу, такому как sin (), cos () и tan()) может превратиться в утомительное занятие. Благодаря
использованию статического импорта, Вы можете избавиться от обязательного
указания имени класса в подобных ситуациях.
Например
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;
hypot = sqrt(pow(side1, 2) + pow(side2,
2));
System.out.println("Given sides of
lengths " +
side1 + " and
" + side2 +
" the hypotenuse is
" +
hypot); } }
Выше приведенном примере имена sqrt и pow импортированы в область видимости
благодаря приведенным далее операторам статического импорта:
import static Java.lang.Math.sqrt; import static Java.lang.Math.pow;
После включения операторов import static нет необходимости уточнять имена методов sqrt () и pow () с помощью
имени их класса. Следовательно, вычисление
гипотенузы можно описать более удобным способом, как показано в следующей строке:
hypot = sqrt(powfsidel, 2) + pow(side2,
2));
Как видите, этот вариант читается
гораздо легче. Существуют два варианта синтаксической
записи оператора import static. Первый, приведенный выше примере, вариант импортирует единичное имя. Его
общий вид приведен в следующей строке:
import
static pkg.type-namе.static-member-name;
В этой записи type - name —
это
имя класса или интерфейса, содержащее нужный статический член. Полное имя
пакета, в который входит заданный класс или интерфейс, определено в pkg. А имя члена содержится в static-member-name. Во втором варианте
статического импорта, общий вид которого приведен в следующей
строке, импортируются все статические члены:
import
static pkg. type-name.*;
Если Вы будете
использовать много статических методов или полей, определенных в классе, второй вариант записи позволит импортировать их без явного
перечисления. Таким образом, программа из приведенного примера могла бы с помощью единственного оператора import импортировать
оба метода: sqrt () и pow () (и все остальные статические члены
класса Math) в область видимости
следующим образом:
import static Java.lang.Math.*;
Конечно, статический импорт не ограничен
только классом Math или только методами. В
следующей строке приведен пример импортирования статического поля System.out:
import
static Java.lang.System.out;
После вставки
этого оператора, можно вывести на консоль без уточнения имени
стандартного вывода out именем system, как показано в следующей строке:
out.println("After importing
System.out, you can use out directly.")
Хорошо ли импортировать поле system.out таким образом— это вопрос для обсуждения. Хотя такой импорт укорачивает
оператор, после его применения у человека, читающего программу, пропадает
уверенность в том, что имя out ссылается на поле System.out.
|