Джош Блох
.pdfEffective Java™
Programming Language Guide
Second Edition
Joshua Bloch
ADDISON-WESLEY
Boston • San Francisco • New York • Toronto • Montreal
London • Munich • Paris • Madrid
Capetown • Sydney • Tokyo • Singapore • Mexico City
Effective Java™ Programming Language Guide
Srcond Edition
Joshua Bloch
Java™ Эффективное программирование Второе издание Джошуа Блох
Переводчик Е. Коротылев Верстка Т. Середа
Copyright © 2008 Sun Microsystems, Inc.
4150 Network Circle,
Santa Clara, California 95054, U .S.A .
Library of Congress control Number: 2008926278 ISNB-13: 978-0-321-3568-0
ISNB-10: 0-321-3568-3
© Издательство «Лори», 2014 Изд. № : OAI (03)
Л Р № : 070612 30.09.97 г. ISBN 978-5-85582-348-6
Подписано в печать 05.01.2014. Формат 70x100/16
Бумага офсет № 1. Гарнитура Академическая. Печать офсетная Печ. л. 29. Тираж 200
Благодарности
ко второй редакции
Q |
~ |
' ....... |
.............................. ...... |
ЗЖ благодарю читателей первой редакции за то, что приняли ее с эн тузиазмом, за то, что близко к сердцу приняли мои идеи, за то, что сообщили мне о положительном влиянии на них и их работу. Я благо дарю профессоров, использующих эту книгу в преподавании, а также инженеров, взявших ее на вооружение.
Я благодарю команду из Addison—Wesley за доброту, професси онализм, терпение и сохранение достоинства, несмотря на давление. Всегда сохранял спокойствие Грег Доунч — замечательный редактор и джентльмен. Руководитель производства Джули Нахил олице творяла в себе все то, что должен представлять собой руководитель производства, — она была прилежна, быстра, организованна и дру желюбна. Литературный редактор Барбара Вуд была достаточно ще петильна и с должным чувством вкуса.
Я вновь должен благодарить судьбу за то, что у меня была лучшая команда рецензентов, которую только можно представить, и я ис кренне благодарю каждого из них. Основная команда, люди, кото рые просмотрели каждую главу, — этоЛекси Боер (Lexi Bougher), Синди Блох (Cindy Bloch), Бет Боттос (Beth Bottos), Джо Боу-
VI
Благодарности ко второй редакции
бир (Joe Bowbeer), Брайан Гоутс (Brian Goetz), Тим Хэлоран (Tim Halloran), Брайан Кернихэм (Brian Kernigham), Роб Конингсберг (Rob Koningsberg), Тим Пирлс (Tim Peierls), Билл Пу (Bill Pough), Йошики Шибата (Yoshiki Shibata), Питер Стаут (Peter Stout), Пи тер Вайнбергер (Peter Weinberger) и Фрэнк Неллин (Frank Yellin). Другие рецензенты - Пабло Беллвер (Pablo Bellver), Дэн Блох (Dan Bloch), Дэн Борнстайн (Dan Bornstein), Кевин Буриллион (Kevin Bourrillion), Мартин Буххольц (Martin Buchholz), Джо Дарси (Joe Darcy), Нил Гафтер (Neil Gafter), Лоренс Гонсалвес (Laurence Gonsalves), Аарон Гринхаус (Aaron Greenhouse), Барри Хейс (Barry Hayes), Питер Джоунс (Peter Jones), Анджелина Лангер (Angelika Langer), Даг Ли (Doug Lee), Боб Ли (Bob Lee), Джерими Менсон (Jeremy Manson), Том Мэй (Tom May), Майк Мак Клоски (Mike McCloskey), Андрей Терещенко (Andriy Tereshshenko) и Пол Тима (Paul Тут а ). Э ти рецензенты внесли много предложений, привед ших к улучшению этой книги, и избавили меня от многих неловких ситуаций. Тем не менее, если я и оказываюсь где-то сейчас в нелов ком положении, то это исключительно моя ответственность.
Особая благодарность Дагу Ли и Тиму Пирлсу, которые озвучи ли многие идеи, отраженные в этой книге. Даг и Тим щедро и безо говорочно жертвовали своим временем и делились своими знаниями.
Я благодарю менеджера Google Прабху Кришну (Prabha Krishna) за ее бесконечную поддержку и содействие.
И наконец я благодарю свою жену, Синди Блох, за то, что она вдохновила меня на написание этой книги и прочитала каждую ста тью в необработанном виде, за помощь мне в работе с программой Framemaker, за написание предметного указателя и просто за то, что терпела меня в процессе написания всей книги.
VII
Благодарности
к первой редакции
( |
1 |
J91благодарю Патрика Чана (Patrick Chan) за то, что он посовето вал мне написать эту книгу, а также подбросил идею Лайзе Френдли (Lisa Friendly), главному редактору серии, Тима Линдхолма (Tim Lindholm), технического редактора серии, и Майка Хендрик сона (Mike Hendrickson), исполнительного редактора издательства Addison—Wesley Professional. Благодарю Лайзу, Тима и Майка за их поддержку при реализации этого проекта, за сверхчеловеческое терпение и несгибаемую веру в то, что когда-нибудь я напишу эту книгу.
Я благодарю Джеймса Гослинга (James Gosling) и его незау рядную команду за то, что они дали мне нечто значительное, о чем можно написать, а также многих разработчиков платформы Java, последовавших стопами Джеймса. В особенности я благодарен моим коллегам по работе в компании Sun из Java Platform Tools and Libraries Group за понимание, одобрение и поддержку. В эту группу входят Эндрю Беннетт (Andrew Bennett), Джо Дарси (Joe Darcy), Нил Гафтер (Neal Gafter), Айрис Гарсиа (Iris Garcia), Константин Кладко (Konstantin Kladko), Иена Литтл (Ian Little), Майк Макло-
VIII
Благодарности к первой редакции
ски (Mike McCloskey) и Марк Рейнхольд (Mark Reinhold). Среди бывших членов группы: Дзенгуа Ли (Zhenghua Li), Билл Мэддокс (Bill Maddox) и Нейвин Санджива (Naveen Sanjeeva).
Я благодарю моего руководителя Эндрю Беннетт (Andrew Bennett) и директора Ларри Абрахамса (Larry Abrahams) за полную и страстную поддержку этого проекта. Благодарю Рича Грина (Rich Green), вице-президента компании Java Software, за создание усло вий, когда разработчики имеют возможность творить и публиковать свои работы.
Мне чрезвычайно повезло с самой лучшей, какую только можно вообразить, группой рецензентов, и я приношу мои самые искренние благодарности каждому из них: Эндрю Беннетту (Andrew Bennett), Синди Блох (Cindy Bloch), Дэну Блох (Dan Bloch), Бет Ботос (Beth Bottos), Джо Баубиеру (Joe Bowbeer), Джиладу Враче (Gilad Bracha), Мэри Кампьон (Mary Campione), Джо Дарси (Joe Darcy), Дэвиду Экхардту (David Eckhardt), Джо Фиалли (Joe Fialli), Лайзе Френдли (Lisa Friendly), Джеймсу Гослингу (James Gosling), Пите ру Хаггеру (Peter Haggar), Брайену Кернигану (Brian Kernighan), Константину Кладко (Konstantin Kladko), Дагу Ли (Doug Lea), Дзенгуа Ли (Zhenghua Li), Тиму Линдхолму (Tim Lindholm), Май ку Маклоски (Mike McCloskey), Тиму Пейерлсу (Tim Peierls), Марку Рейнхолду (Mark Reinhold), Кену Расселу (Ken Russell), Биллу Шэннону (Bill Shannon), Питеру Стауту (Peter Stout), Филу Уодлеру (Phil Wadler), ДавидуХолмсу (David Holmes) и двум ано нимным рецензентам. Они внесли множество предложений, которые позволили существенно улучшить эту книгу и избавили меня от мно гих затруднений. Все оставшиеся недочеты полностью лежат на моей совести.
Многие мои коллеги, работающие в компании Sun и вне ее, участвовали в технических дискуссиях, которые улучшили качество этой книги. Среди прочих: Бен Гомес (Ben Gomes), Стефен Грерап (Steffen Grarup), Питер Кесслер (Peter Kessler), Ричард Рода (Richard Roda), Джон Роуз (John Rose) и Дэвид Стаутэмайер (David Stoutamire), давшие полезные разъяснения. Особая благо
IX
Благодарности к первой редакции
дарность Дагу Ли (Doug Lea), озвучившему многие идеи в этой кни ге. Даг неизменно щедро делился своим временем и знаниями.
Я благодарен Джули Дайниколе (Julie Dinicola), Джекки Дусетт (Jacqui Doucette), Майку Хендриксону (Mike Hendrickson), Хизер Ольщик (Heather Olszyk), Трейси Расс (Tracy Russ) и всем сотруд никам Addison—Wesley за их поддержку и профессионализм. Даже будучи до невозможности занятыми, они всегда были дружелюбны
иучтивы.
Яблагодарю Гая Стила (Guy Steele), написавшего Предисловие. Его участие в этом проекте — большая честь для меня.
Наконец, я благодарен моей жене Синди Блох (Cindy Bloch), которая своим ободрением, а подчас и угрозами помогла мне напи сать эту книгу. Благодарю за чтение каждой статьи в необработан ном виде, за помощь при работе с программой Framemaker, написа ние предметного указателя и за то, что терпела меня, пока я писал эту книгу.
Содержание
(с .......... |
:.....;.................. |
~ ~ |
Предисловие |
|
|
|
|
хи |
||
Предисловие автора ко второй редакции |
xviii |
||||||
Предисловие автора ко второй редакции |
хх |
||||||
1 |
Введение |
|
|
|
|
1 |
|
2 |
Создание и уничтожение объектов |
6 |
|||||
|
1 |
Рассмотрите |
возможность |
замены конструкторов |
|||
|
|
статическими |
методами генерации........................ |
6 |
|||
|
2 |
Используйте |
шаблон |
B u ilder, когда |
|
||
|
|
приходится иметь дело с большим |
|
||||
|
|
количеством |
параметров |
конструктора.................. |
5 |
||
|
3 |
Свойство |
синглтон |
обеспечивайте закрытым |
|
||
|
|
конструктором или |
типом |
перечислений.............. |
24 |
||
|
4 |
Отсутствие экземпляров |
обеспечивает |
|
|||
|
|
за крытый |
конструктор........................................ |
|
27 |
||
|
5 |
Избегайте |
ненужных объектов............................. |
28 |
XI
Содержание
.444V4\\V\\VV\\\4'№^\^\\\\N\\4\VS4\SN>WS\'J&44\4«^4№N^4\4\S\'^\^
6 |
Уничтожайте устаревшие ссылки (на объекты) |
.... 34 |
||
7 |
Остерегайтесь методов |
f in a liz e ........................ |
38 |
|
3 Методы, общие для всех объектов |
46 |
|||
8 |
Переопределяя метод equals, |
|
||
|
соблюдайте общие соглашения .......................... |
46 |
||
9 |
Переопределяя метод equals, |
|
||
|
всегда |
переопределяйте |
hashCode...................... |
62 |
10 |
Всегда |
переопределяйте |
метод to S trin g ............. |
71 |
11 |
Соблюдайте осторожность |
|
|
|
при переопределении метода |
c lo n e ..................... |
74 |
12 |
Подумайте над реализацией |
интерфейса |
|
|
Comparable......................................................... |
|
86 |
4 Классы и интерфейсы |
|
94 |
13Сводите к минимуму доступность классови членов .. 94
14В открытых классах используйте
|
методы доступа, |
а не открытые |
поля................ |
100 |
|
15 |
Предпочитайте |
постоянство............................... |
|
102 |
|
16 |
Предпочитайте |
компоновку наследованию.......... |
114 |
||
17 |
Проектируйте |
и документируйте |
наследование |
|
|
|
либо запрещайте |
его ....................................... |
|
122 |
18Предпочитайте интерфейсы абстрактнымклассам . 130
19Используйте интерфейсы
|
только для |
определения типов.......................... |
138 |
20 |
Объединение |
заменяйте |
|
|
иерархией классов............................................ |
140 |
|
21 |
Используйте |
объект функции |
|
|
для выполнения сравнения................................. |
144 |
XII
Содержание
22 Предпочитайте |
статические классы-члены |
нестатическим |
................................................ 148 |
5 Средства обобщенногопрограммирования
(Generics) |
|
|
|
|
|
154 |
|
23 |
Не используйте |
необработанные типы |
|
|
|||
|
в новом коде.................................................... |
|
|
|
|
155 |
|
24 |
Избегайте предупреждений |
|
|
||||
|
о непроверенном |
коде....................................... |
|
|
163 |
||
25 |
Предпочитайте |
списки массивам......................... |
|
166 |
|||
26 |
Поддерживайте |
обобщенные типы......................... |
|
173 |
|||
27 |
Поддерживайте |
обобщенные методы..................... |
|
179 |
|||
28 |
Используйте |
ограниченные |
групповые |
символы |
|
||
|
для увеличения |
гибкости |
A P I ............................ |
|
186 |
||
29 |
Использование |
неоднородных контейнеров.......... |
195 |
||||
6 Перечислимые типы ианнотации |
|
203 |
|||||
30 |
Используйте |
перечислимые |
типы |
|
|
||
|
вместо констант |
i n t ........................................ |
|
|
203 |
||
31 |
Используйте |
поля |
экземпляра |
|
|
||
|
вместо числовых значений................................ |
|
218 |
||||
32 |
Используйте |
EnumSet |
|
|
|
||
|
вместо битовых полей....................................... |
|
|
219 |
|||
33 |
Используйте |
EnumMap вместо |
|
|
|||
|
порядкового |
индексирования............................. |
|
221 |
|||
34 |
Имитируйте расширяемые перечислимые |
типы |
|
||||
|
с помощью интерфейсов..................................... |
|
|
227 |
|||
35 |
Предпочитайте |
аннотации |
|
|
|
||
|
шаблонам присвоения имен................................ |
|
232 |
ХШ