Джош Блох
.pdfСодержание
|
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 сослужит вам добрую службу в процессе последующей перестройки программы
ххш