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

Джош Блох

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

Содержание

 

36

Используйте

аннотацию

Override

 

 

 

 

 

 

последовательно..............................................

 

 

 

 

 

241

 

37

Используйте

маркерные

интерфейсы

 

 

 

 

 

 

для определения типов.....................................

 

 

 

 

244

7

Методы

 

 

 

 

 

 

 

 

248

 

38

Проверяйте достоверность параметров..............

 

 

248

 

39

При необходимости

создавайте

 

 

 

 

 

 

резервные

копии...............................................

 

 

 

 

 

252

 

40

Тщательно

проектируйте

сигнатуру метода........

 

258

 

41

Перезагружая методы, соблюдайте осторожность ..

261

 

42 Используйте varargs с осторожностью..............

 

 

269

 

43

Возвращайте

массив

нулевой длины,

а не

n u ll

..

274

 

44

Для всех

открытых элементов API

пишите

 

 

 

 

doc-комментарии ............................................

 

 

 

 

 

277

8

Общие вопросы

программирования

 

 

 

286

 

45

Сводите к минимуму область видимости

 

 

 

 

 

локальных переменных.......................................

 

 

 

 

286

 

46

Предпочитайте использование цикла for-each

.. 290

 

47

Изучите библиотеки и пользуйтесь ими............

 

 

294

 

48

Если требуются

точные

ответы, избегайте

 

 

 

 

использования

типов flo a t и double................

 

 

298

 

49

Отдавайте

предпочтение

использованию

обычных

 

 

примитивных

типов,

а не упакованных

 

 

 

 

 

примитивных

типов............................................

 

 

 

 

 

301

 

49

Не используйте

строку

там,

 

 

 

 

 

 

где более уместен иной тип.............................

 

 

 

306

 

50

При конкатенации строк

опасайтесь

 

 

 

 

 

потери производительности...............................

 

 

 

310

XIV

Содержание

51

Для ссылки на объект используйте

 

 

его интерфейс...................................................

311

52

Предпочитайте интерфейс отражениюк л а сса ....

3 1 4

53

Соблюдайте

осторожность при использовании

 

 

машинозависимых методов..................................

319

54

Соблюдайте

осторожность приоптимизации..........

321

55

При выборе

имен придерживайтесь

 

 

общепринятых соглашений..................................

325

9

Исключения

 

 

 

331

 

56

Используйте

исключения лишь

 

 

 

в исключительных ситуациях.............................

331

 

57

Применяйте

обрабатываемые исключения

 

 

 

для восстановления, для программных ошибок

 

 

 

используйте

исключения

времени выполнения...

335

 

58

Избегайте ненужных обрабатываемых исключений ..

338

 

59

Предпочитайте

стандартныеисключения..............

341

 

60

Инициируйте

исключения,

соответствующие

 

 

 

абстракции.......................................................

 

 

 

344

 

61

Для

каждого

метода документируйте

 

 

 

все

инициируемые исключения...........................

347

 

62

В описание

исключения добавляйте

 

 

 

информацию о сбое............................................

 

350

 

63

Добивайтесь

атомарности

методов

 

 

 

по

отношению к

сбоям.......................................

 

353

 

64

Не игнорируйте

исключений...............................

356

10

Потоки

 

 

 

 

358

65Синхронизируйте доступ потоков к совместно используемым изменяемым данным.. 358

XV

Содержание

66

Избегайте

избыточной синхронизации................

365

67

Предпочитайте использование

экзекуторов

 

 

и заданий

вместо

потоков................................

 

 

373

68

Предпочитайте использовать

утилиты

 

 

параллельности,

нежели

w ait

иn o t if y ..............

376

69

При работе с потоками документируйте

 

 

уровень безопасности ....................................

 

 

 

383

70

С осторожностью

используйте

 

 

 

 

отложенную

инициализаию..................................

 

 

388

71

Не

попадайте в зависимость

 

 

 

 

от

планировщика

потоков..................................

 

 

393

72

Избегайте

группировки потоков........................

 

396

11 Сериализация

 

 

 

 

 

399

73

Соблюдайте

осторожность

при реализации

 

 

интерфейса

S e r ia liz a b le

..................................

 

 

399

74

Рассмотрите возможность

использования

 

 

специализированной сериализованной формы....

407

75

Метод readObject должен

создаваться

 

 

с защитой.........................................................

 

 

 

 

 

416

76

Для контроля над экземплярами предпочитайте

 

 

использование перечислимых

типов

методу

 

 

readResolve......................................................

 

 

 

 

424

77

Рассмотрите

использование агентов

сериализации

 

 

вместо сериализованных экземпляров................

430

Список литературы

 

 

 

 

435

XVI

Предисловие

ж а ш ж ж т т м ж ж т т т ж т т а м м ш т т ш ш д т ш »

Если бы сослуживец сказал вам: «Моя супруга сегодня вечером

производит дома необычный обед. Придешь?», то вам в голову, ве­ роятно, придут сразу три мысли: вас уже пригласили на обед, во-вто­ рых, ваш сослуживец явно иностранец, ну и, прежде всего, вы будете крайне озадачены.

Если вы сами когда-нибудь изучали второй язык, а затем про­ бовали им пользоваться за пределами аудитории, то уже знаете, что есть три вещи, которые необходимо знать: каким образом структу­ рирован изучаемый язык (грамматика), как называются вещи, о ко­ торых вы хотите сказать (словарь), а также общепринятые и эф­ фективные варианты разговора о повседневных вещах (лексические обороты). В аудитории слишком часто ограничиваются изучением лишь первых двух из этих вещей, и вы обнаруживаете, что носители языка постоянно давятся от смеха, выслушивая, как вы пытаетесь, чтобы вас поняли.

С языком программирования дело обстоит практически так же. Вам необходимо понимать суть языка: является он алгоритмиче­ ским, функциональным или объектно-ориентированным. Вам нуж­ но знать словарь языка: какие структуры данных, операции и воз­ можности предоставляют стандартные библиотеки. Вам необходимо также ознакомиться с общепринятыми и эффективными способами структурирования вашего кода. В книгах, посвященных языкам про-

Предисловие

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

Например, язык программирования Java — это объектно-ориен­ тированный язык с единичным наследованием, обеспечивающим для каждого метода императивный (ориентированный на действия) стиль программирования. Его библиотеки ориентированы на поддержку графических дисплеев, работу с сетью, распределенные вычисления и безопасность. Однако как наилучшим образом использовать этот язык на практике?

Есть и другой аспект. Программы, в отличие от произнесенных фраз, а также большинства книг и журналов, имеют возможность меняться со временем. Обычно недостаточно создать программный код, который эффективно работает и без труда может быть понят другими людьми. Нужно еще организовать этот код таким образом, чтобы его можно было легко модифицировать. Для некоторой зада­ чи А может быть десяток вариантов написания программного кода. И з этих десяти семь окажутся неуклюжими, неэффективными или запутывающими читателя. Какой же из оставшихся трех вариантов вероятнее всего будет похож на программный код, который потре­ буется в следующем году для новой версии программы, решающей задачу А ’?

Есть много книг, по которым можно изучать грамматику языка программирования Java, в том числе книги «The Java™ Programming Language» авторов Arnold, Gosling и Holmes [Arnold05] ИЛИ «The Java™ Language Specification» авторов Gosling, Joy, Bracha и вашего покорного слуги [JLS]. Точно так же есть множество книг, посвя­ щенных библиотекам и прикладным интерфейсам, которые связаны с языком Java.

Эта книга посвящена третьей теме: общепринятым и эффектив­ ным приемам работы с языком Java. Джошуа Блох (Joshua Bloch)

XVlll

Предисловие

провел несколько лет в компании Sun Microsystems, работая с язы­ ком программирования Java, занимаясь расширением и реализацией программного кода. Он также прочел большое количество программ­ ного кода, написанного многими людьми, в том числе и мной. Здесь же, приведя в некую систему, он дает дельные советы о том, каким образом структурировать ваш код, чтобы он работал хорошо, чтобы его смогли понять другие люди, чтобы последующие модификации

иусовершенствования доставляли меньше головной боли и даже, возможно, чтобы ваши программы были приятными, элегантными

икрасивыми.

Гай Л. Стил-младший (Guy L. Steele Jr.)

Берлингтон, шт. Массачусетс Апрель 2001 г.

XIX

Предисловие автора

ко второй редакции

г"

....

- ............. ..............

Л :V

с

 

 

 

тех пор как я написал первую редакцию этой книги, произошло много изменений в платформе Java, и я решил, что давно пора уже на­ писать вторую редакцию. Наиболее значимыми изменениями стали добавление обобщений, типов перечислений, комментариев, автома­ тического создания контейнеров, циклов типа for-each в Java 5. Также новшеством стало добавление новой библиотеки совместимости java, util.concurrent, также появившейся в Java 5. Мне повезло, что вме­ сте с Джиладом Врачей я смог возглавить команду, разработавшую новые особенности языка. Мне также повезло в том, что удалось ра­ ботать в команде, возглавляемой Дагом Ли и разработавшей библи­ отеку совместимости.

Другим значительным изменением в платформе стало ее усвое­ ние современными интегрированными средами разработки, такими как Eclipse, IntelliJ ID EA и NetBeans, и инструментами статическо­ го анализа, как, например, FindBugs. Я не принимал участия в этом процессе, однако смог извлечь из этого огромную выгоду и узнал, как они влияют на опыт разработки.

В 2004 году я перешел из компании Sun в компанию Google, однако продолжал принимать участие в разработке платформы Java

XX

Предисловие автора ко второй редакции

в течение последних четырех лет, помогая в разработке взаимосовме­ стимости и коллекций программных интерфейсов, используя офисы Google, а также Java Community Process. Я также имел удоволь­ ствие разрабатывать библиотеки для использования в Google. Теперь я знаю, что такое быть пользователем.

Когда в 2001 году я писал первую редакцию книги, моей основ­ ной целью было поделиться с вами моим опытом, чтобы вы смогли повторить мои успехи и избежать моих неудач. Новый материал так­ же приводит реальные примеры из библиотек платформы Java.

Успех первой редакции превзошел все мои ожидания, и я сделал все возможное, чтобы сохранить дух предыдущей редакции, осве­ щая новый материал, что требовалось для обновления данной книги. Невозможно было избежать того, что книга стала больше, — и она действительно стала. Вместо 57 в ней 78 статей. И я не просто до­ бавил 23 новые статьи, а тщательно переработал весь оригинальный вариант — и удалил некоторые статьи, которые уже просто неакту­ альны. В приложении вы можете увидеть, как соотносится материал этой редакции с материалом первой редакции.

В предисловии к первой редакции я написал, что язык програм­ мирования Java и его библиотеки очень способствуют качеству и про­ изводительности и как с ними здорово работать. Изменения в 5-м и 6-м выпусках сделали их еще лучше. Сейчас платформа гораздо больше и сложнее, чем в 2001 году, но, когда вы познакомитесь с ее идиоматикой и примерами использования новых возможностей, это позволит сделать ваши программы лучше и сделает вашу жизнь лег­ че. Надеюсь, что эта редакция передаст вам мой энтузиазм и помо­ жет вам более эффективно и с большим удовольствием использовать платформу и ее новые возможности.

Сан-Хосе, ш т. Калифорния

Апрель 2008 г.

XXI

Предисловие автора

к первой редакции

— ------ ----- - - ------- -----

11

• '

______ '

___ 1

' '

: ь ■■■

[

 

 

 

 

 

 

1

А 1996 году я направился на запад работать в компании JavaSoft, как она тогда называлась, поскольку было очевидно, что именно там происходят главные события. На протяжении пяти лет я рабо­ тал архитектором библиотек для платформы Java. Я занимался про­ ектированием и разработкой множества таких библиотек, занимался их обслуживанием, а также давал консультации по многим другим библиотекам. Контроль над этими библиотеками в ходе становления платформы языка Java — такая возможность предоставляется толь­ ко раз в жизни. Не будет преувеличением сказать, что я имел честь работать с некоторыми великими разработчиками нашего времени. В процессе работы я многое узнал о языке программирования Java: что там работает, а что нет, как пользоваться языком и его библиоте­ ками для получения наилучшего результата.

Эта книга является попыткой поделиться с вами моим опытом, чтобы вы смогли повторить мои успехи и избежать моих неудач. Оформление книги я позаимствовал из руководства Скотта Мей­ ерса (Scott Meyers) «Effective C + + » [Meyers98], которое состоит из 50 статей, каждая из которых посвящена одному конкретному правилу, позволяющему улучшить ваши программы и проекты. Я на­

XXII

Предисловие автора к первой редакции

шел такое оформление необычайно эффективным, и, надеюсь, вы тоже его оцените.

Во многих случаях я осмелился иллюстрировать статьи реаль­ ными примерами из библиотек для платформы Java. Говоря, что не­ что можно сделать лучше, я старался брать программный код, ко­ торый я писал сам, однако иногда я брал разработанное коллегами. Приношу мои искренние извинения, если, несмотря на все старания, кого-либо при этом обидел. Негативные примеры приведены не для того, чтобы кого-то опорочить, а с целью сотрудничества, чтобы все мы могли извлечь пользу из опыта тех, кто уже прошел этот путь.

Хотя эта книга предназначена не только для людей, занимаю­ щихся разработкой повторно используемых компонент, она неиз­ бежно отражает мой опыт в написании таковых, накопленный за последние два десятилетия. Я привык думать в терминах приклад­ ных интерфейсов (A P I) и предлагаю вам делать то же. Даже если вы не занимаетесь разработкой повторно используемых компонент, если вы будете пользоваться этими терминами, это может повысить качество написанных вами программ. Более того, нередко случа­ ется писать многократно используемые компоненты, даже не по­ дозревая об этом: вы написали нечто полезное, поделились своим результатом с приятелем, и вскоре у вас будет уже с полдюжины пользователей. С этого момента вы лишаетесь возможности сво­ бодно менять этот A PI и получаете благодарности за все те усилия, которые вы потратили на его разработку, когда писали эту програм­ му в первый раз.

Мое особое внимание к разработке API может показаться не­ сколько противоестественным для ярых приверженцев новых облег­ ченных методик разработки программного обеспечения, таких как «Экстремальное программирование» [Веск99]. В этих методиках особое значение придается написанию самой простой программы, ка­ кая только сможет работать. Если вы пользуетесь одной из этих ме­ тодик, то обнаружите, что внимание к разработке A PI сослужит вам добрую службу в процессе последующей перестройки программы

ххш

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