Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Джош Блох

.pdf
Скачиваний:
56
Добавлен:
08.03.2016
Размер:
27.13 Mб
Скачать

Effective 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

ХШ

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]