Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

В этом заключается основная идея параметризованных типов Java: вы указываете, какой тип должен использоваться, а механизм параметризации берет на себя все подробности.

Кортежи

При вызове метода часто требуется, чтобы метод возвращал несколько объектов. Команда return позволяет вернуть только один объект, поэтому проблема решается созданием объекта, содержащего несколько возвращаемых объектов. Конечно, можно создавать специальный класс каждый раз, когда возникает подобная ситуация, но параметризованные типы позволяют решить проблему один раз и избавиться от хлопот в будущем. Заодно решается проблема безопасности типов на стадии компиляции.

Концепция нескольких объектов, «упакованных» в один объект, называется кортежем (tuple). Получатель объекта может читать элементы, но не может добавлять их (эта концепция еще называется объектом передачи данных).

Обычно кортеж может иметь произвольную длину, а все объекты кортежа могут относиться к разным типам. Однако мы хотим задать тип каждого объекта и при этом гарантировать, что при чтении значения будет получен правильный тип. Для решения проблемы переменной длины мы создадим несколько разных кортежей. Вот один из них, рассчитанный на два объекта:

//: net/mi ndvi ew/uti1/TwoTuple.java

package net.mindview.util;

public class TwoTuple<A,B> { public final A first; public final В second;

public TwoTuple(A а, В b) { first = a; second = b; } public String toStringO {

return "(" + first + " + second + ")";

}

} ///:-

Конструктор запоминает сохраняемый объект, а вспомогательная функция toStringO выводит значения из списка. Обратите внимание: кортеж подразумевает упорядоченное хранение элементов.

При первом чтении может показаться, что такая архитектура нарушает общие принципы безопасности программирования на Java. Разве first и second не должны быть объявлены приватными, а обращения к ним осуществляться только из методов getFirst и getSecond? Подумайте, какая безопасность реализуется в этом случае: клиент может читать объекты и делать с прочитанными значениями все, что пожелает, но не может изменить first и second. Фактически объявление final делает то же самое, но короче и проще.

Кортежи большей длины создаются посредством наследования. Добавить новый параметр типа несложно:

//: net/mi ndvi ew/uti1/ThreeTuple.java

package net.mi ndvi ew.uti1;

public class ThreeTuple<A.B,C> extends TwoTuple<A,B> { public final С third; public ThreeTuple(A а, В b, С с) { super(a. b); third = c:

}

public String toStringO {

return "(" + first + " + second + ", " + third +")";

}

// net/mi ndvi ew/uti1/FourTuple. java package net.mindview.util;

public class FourTuple<A,B,C,D> extends ThreeTuple<A,B,C> { public final D fourth; public FourTuple(A а, В b. С с. D d) { super(a. b, c), fourth = d;

}

public String toStringO {

return "(" + first + ", " + second + " + third + " + fourth + ")";

}

} Hill . net/mi ndvi ew/uti1/Fi veTuple.java package net.mindview util;

public class FiveTuple<A,B,C,D,E> extends FourTuple<A,В,C.D> { public final E fifth;

public FiveTuple(A а. В b. С с. D d. E e) { super(a, b. c. d); fifth = e.

}

public String toStringO {

return "(" + first + " + second + " +

third + " + fourth + \ " + fifth + ")";

}

} ///-

Чтобы воспользоваться этими классами, достаточно определить кортеж нужной длины как возвращаемое значение функции, а затем создать и вернуть его командой return:

II: generics/TupleTest.java i mport net.mi ndvi ew.uti1.*;

class Amphibian {} class Vehicle {}

public class TupleTest {

static TwoTuple<String.Integer> fO {

// Автоматическая упаковка преобразует int в Integer: return new TwoTuple<String.Integer>("hi", 47);

}

static ThreeTuple<Amphibian,String,Integer> g {

return new ThreeTuple<Amphibian, String, Integer>( new AmphibianO. "hi", 47);

}

static

FourTuple<Vehicle,Amphibian,String,Integer> hO { return

new FourTuple<Vehicle,Amphibian,String.Integer>(

new VehicleO, new AmphibianO, "hi". 47);

}

static

FiveTuple<Vehicle.Amphibian.String,Integer.Double> kO { продолжение & return new

Fi veTuple<Vehi cle,Amphi bi an,Stri ng,Integer,Double>(

new VehicleO, new AmphibianO. "hi", 47, 11.1);

}

public static void main(String[] args) {

TwoTuple<String.Integer> ttsi = f; System.out.pri ntln(ttsi);

// ttsi first = "there"; // Ошибка компиляции- final System.out.pri ntln(g); System.out.println(hO); System, out. println(kO);

}

} /* Output: (hi. 47)

(Amphibian@lf6a7b9, hi, 47) (Vehicle@35ce36, Amphibian@757aef, hi, 47) (Vehicle@9cabl6, Amphibian@la46e30, hi, 47, 11.1) *///:-

Спецификация final для public-полей предотвращает их изменение после конструирования (поэтому попытка выполнения команды ttsi.first="there" приводит к ошибке).

Конструкции new получаются немного громоздкими. Позднее в этой главе будет показано, как упростить их при помощи параметризованных методов.

Поделиться:
Популярные книги

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Старший лейтенант, парень боевой!

Зот Бакалавр
8. Героями не становятся, ими умирают
Фантастика:
боевая фантастика
5.00
рейтинг книги
Старший лейтенант, парень боевой!

На границе империй. Том 7. Часть 3

INDIGO
9. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.40
рейтинг книги
На границе империй. Том 7. Часть 3

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Неудержимый. Книга XXVI

Боярский Андрей
26. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVI

Мечников. Из доктора в маги

Алмазов Игорь
1. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Мечников. Из доктора в маги

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Печать пожирателя 2

Соломенный Илья
2. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Печать пожирателя 2

Ну, здравствуй, перестройка!

Иванов Дмитрий
4. Девяностые
Фантастика:
попаданцы
альтернативная история
6.83
рейтинг книги
Ну, здравствуй, перестройка!

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Ботаник

Щепетнов Евгений Владимирович
1. Ботаник
Фантастика:
фэнтези
боевая фантастика
4.56
рейтинг книги
Ботаник

Газлайтер. Том 31

Володин Григорий Григорьевич
31. История Телепата
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Газлайтер. Том 31

Моя простая курортная жизнь

Блум М.
1. Моя простая курортная жизнь
Проза:
современная проза
5.00
рейтинг книги
Моя простая курортная жизнь

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI