Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Герберт Шилдт. Java 2, v5.0 (Tiger). Новые возм...doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
1.21 Mб
Скачать

Несколько ограничений

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

Во-вторых, все методы, объявляемые в аннотации, не должны иметь параметров. Кроме того, они должны возвращать один из перечисленных далее типов:

  • простой тип, такой как int или double;

  • объект типа String или class;

  • тип enum ;

  • другой тип аннотации;

  • массив элементов, одного из перечисленных в предыдущих пунктах типов.

Аннотации не могут быть настраиваемыми. Другими словами, они не могут принимать параметры типа. И последнее, в них нельзя задавать ключевое слово throws.

Глава 8 Статический импорт

Новое средство, которое многие программисты сочтут весьма полезным, называется статическим импортом (static import) и расширяет возможности ключевого слова import. Оператор языка import, снабженный ключевым словом static, следующим за ключевым словом import, может применяться для импорта статических членов класса или интерфейса. Благодаря наличию статического импорта стало возможным ссылаться на статические члены непосредственно по их именам без уточнения имени их класса. Это упрощает и сокращает синтаксис обращения к статическому члену.

Описание статического импорта

Для того чтобы понять пользу статического импорта, начнем с примера, в котором это средство не применяется. В листинге 8.1 вычисляется гипотенуза прямоугольного треугольника. В программе используются два статических метода из встроенного в язык Java класса Math, являющегося частью пакета Java.lang. Первый метод, Math.pow(), возвращает значение, возведенное в определенную степень. Второй — Math.sqrt() — возвращает квадратный корень своего аргумента.

Листинг 8.1. Вычисление гипотенузы прямоугольного треугольника

class Hypot {

public static void main(String args[]) {

double side1, side2;

double hypot;

side1 = 3.0;

side2 = 4.0;

// Notice how sqrt() and pow() must be qualified by

// their class name, which is Math.

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()) может превратиться в утомительное занятие.

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

Листинг 8.2. Применение статического импорта для имен методов sqrt () и pow()

import static java.lang.Math.sqrt;

import static java.lang.Math.pow;

// Compute the hypotenuse of a right triangle.

class Hypot {

public static void main(String args[]) {

double side1, side2;

double hypot;

side1 = 3.0;

side2 = 4.0;

// Here, sqrt() and pow() can be called by themselves,

// without their class name.

hypot = sqrt(pow(side1, 2) + pow(side2, 2));

System.out.println("Given sides of lengths " +

side1 + " and " + side2 +

" the hypotenuse is " +

hypot);

}

}

В листинге 8.2 имена sqrt и pow импортированы в область видимости благодаря приведенным далее операторам статического импорта:

import static Java.lang.Math.sqrt;

import static Java.lang.Math.pow;

После включения в листинг 8.2. этих операторов нет необходимости уточнять имена методов

sqrt () и pow () с помощью имени их класса. Следовательно, вычисление гипотенузы можно описать более удобным способом, как показано в следующей строке:

hypot = sqrt(powfsidel, 2) + pow(side2, 2));

Как видите, этот вариант читается гораздо легче.