Главная » Java » Пример простого интерфейса Java

2

 

Некий простой интерфейс часто определяет свойство, присущее множеству объектов самых разнообразных классов. Подобные свойства нередко выражают в терминах способности (“ability”) объекта выполнять определенные функции. Например, в составе стандартных пакетов Java есть немало интерфейсов, в названии которых присутствует характерный суффикс “able”

·      Сloneable. Объекты этого типа поддерживают операцию клонирования (см. раздел 3.9 на странице 111).

·      Comparable. Объекты Comparable допускают упорядочение и поэтому могут сравниваться.

·    Runnablе. Соответствующие объекты содержат код, способный выполняться в виде независимого потока вычислений (подробно об этом – в главе 10).

·      Serializable. Объекты этого типа могут быть преобразованы в последовательность байтов с целью сохранения на носителях или пере носа в среду другой виртуальной машины, а затем при необходимости восстановлены в исходном “живом” виде (более полная информация приведена в разделе 15.7 на странице 418).

 

Рассмотрим в качестве примера интерфейс Comparable. Этот интерфейс может быть реализован в любом классе, объекты которого поддерживают некий “естественный порядок”. Интерфейс содержит единственный метод и выглядит следующим образом:

 

public interface Comparable {

int сompareTo(Object о)

}

 

Объявление интерфейса сродни объявлению класса – за тем исключением, что вместо служебного слова сlass используется слово interface. Помимо этого, существуют определенные правила объявления членов интерфейса, о которых вы узнаете чуть позже.

Метод CompareTo в качестве аргумента принимает ссылку на объект типа Object и сравнивает его с текущим объектом, возвращая отрицательное, положительное или нулевое целое число, если, соответственно, текущий объект меньше или больше аргумента, или равен ему. Если два объекта взаимно несопоставимы (обычно вследствие несовместимости их типов), выбрасывается исключение типа СlassСastException.

торый был рассмотрен в главе 2. Естественный порядок тел, являющихся спут1lиками одного и того же “центрального” светила, может быть определен в зависимости от радиуса орбиты их вращения. Соответствующая версия объявления класса Body будет выглядеть, например, так:

 

class Body implements Comparable {

// объявления полей опущены …

int orbitalDistance = … ; // Задается в процессе конструирования

public int compareTo(Object o){

Body other = (Body) o;

If (orbits = other.orbits)

return orbitalDistace – other.orbitalDistace;

else

throw new IllegalArrgumentationException(“Неверное значение orbits”);

}

}

 

 

Первым делом мы отмечаем тот факт, что Body – это сопоставимый (Comparable) тип. Интерфейсные типы, реализуемые классом, в его объявлении перечисляются после служебного слова implements (конструкция implements целиком размещается после предложения extends, если таковое имеется, но перед блоком тела класса). Все указанные в объявлении интерфейсы называют базовыми интерфейсами (superinterfaces) класса. Класс обязан обеспечить реализацию всех методов, определенных в унаследованных базовых интерфейсах, иначе в его объявление следует включить модификатор abstract, имея в виду, что конкретной реализацией в будущем “займутся” какие-либо конкретные (неабстрактные) производные классы.

В примере класса Body, как и во многих других возможных реализациях метода Comparable, используется оператор явного преобразования типов, который заменяет ссылку на объект Object ссылкой на объект класса Body. Преобразование типов осуществляется перед операцией сравнения. Если ссылка, переданная в качестве аргумента, указывает на объект, не относящийся к классу Body и поэтому не поддерживающий подобное преобразование, генерируется исключение типа ClassCastException. Затем вычисляется разность радиусов орбит двух тел и возвращается результат. Если тела не являются спутниками одного и того же “центрального” небесного объекта, они не могут быть сопоставлены, и поэтому выбрасывается исключение типа IllegalArgumentException. Более Подробные сведения об исключениях приведены в главе 8.

Интерфейсы, как и классы, вводят в обиход новые наименования типов, которые могут быть использованы в объявлениях переменных:

Comparable obj;

Действительно, мощь интерфейсов во многом обусловлена именно тем обстоятельством, что зачастую вместо переменных конкретных типов гораздо удобнее и Выгоднее объявлять переменные соответствующих интерфейсных типов. Например, целесообразно определить общий метод сортировки таким образом, чтобы он оказался способен сортировать элементы любого массива объектов типа Comparable  (разумеется, объекты должны быть сопоставимы), независимо от того, какому конкретному классу они принадлежат:

class Sorter {

public static Comparable[] sort(Comparable[] list) {

// Детали реализации …

return list;

}

}

Посредством ссылки на интерфейсный тип, однако, разрешается обращаться

только к членам соответствующего интерфейса. Например, следующий фрагмент

кода породит ошибку компиляции:

Comparable obj = new Body();

String name = obj.getName(); // НЕВЕРНО:

 

// В состве интерфейса Comparable нет метода getName

Если необходимо интерпретировать obj как объект класса Body, следует применить соответствующий оператор преобразования типов. Существует, правда, единственное исключение из этого правила: ссылку на любой интерфейс позволяется трактовать как ссылку на объект класса Object, поскольку Object это базовый класс по отношению ко всем классам и интерфейсам. Поэтому следующее выражение вполне допустимо:

String desc = obj.toString();

Здесь ссылка на интерфейсный тип Comparable неявно преобразуется в ссылку

на тип Object.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии

Комментариев 2

  1. assem_DOS says:

    pudlic int compareTo(Object o){
    che za puDlic????????????)))