Tm programming Language Guide




НазваниеTm programming Language Guide
страница1/22
Дата19.09.2012
Размер8.15 Mb.
ТипДокументы
  1   2   3   4   5   6   7   8   9   ...   22
Effective Java TM

Programming Language Guide


Joshua Bloch


ADDISON- WESLEY


Java TM

Эффективное программирование

Джошуа Блох


Издательство «Лори»


Благодарности

я благодарю Патрика Чана (Patrick Chan) за то, что он посоветовал мне написать эту книгу и подбросил идею Лайзе Френдли (Lisa Friendly), главному редактору серии, а также Тима Линдхолма (Tim Lindholm), технического редактора серии, и Майка Хендриксона (Mike Hendrickson), исполнительного редактора издательства Addison- Wesley Professional. Спасибо Лайзе, Тиму и Майку за их поддержку при реализации проекта, за сверхчеловеческое терпение и несгибаемую веру в то, что когда-нибудь я напишу эту книгу.

Я благодарю Джеймса Гослинга (James Gosling) и его незаурядную команду" за то, что они предоставили мне нечто значительное, о чем можно написать, а также многих разработчиков платформы Java, последователей ДжеЙмса. В особенности я благодарен моим коллегам по работе в компании Sun из Java Platform Тools and Libraries Group за понимание, одобрение и поддержку. В эту группу входят Эндрю Беннетт (Andrew Benriett), Джо Дарси Оое Darcy), Нил Гафтер (Neal Gafter), Айрис Гарсиа (Iris Garcia), Константин Кладко (Konstantin Кladko), Йена Литтл (Ian Little), Майк Маклоски (Mike McCloskey) и Марк Рейнхольд (Mark Reinhold). Среди бывших членов группы: Дзенгуа Ли (Zhenghua Li), Билл Мэддокс (Bill Maddox) и Нейвин Санджива (Naveen Sanjeeva).

Выражаю благодарность моему руководителю Эндрю Беннетту (Andrew Bennett) и директору Ларри Абрахамсу (Larry Abrahams) за полную и страстную поддержку этого проекта. Спасибо Ричу Грину (Rich Green), вице-президенту компании Java Software, за создание условий, при которых разработчики имеют возможность творить и публиковать свои труды.

Мне чрезвычайно повезло с самой лучшей, какую только можно вообразить, группой рецензентов, и я выражаю мои самые искренние благодарности каждому из них: Эндрю Беннетту (Andrew Bennett), Синди Блох (Cindy Вloch), Дэну Блох (Dan Вloch), Бет Ботос (Beth Bottos), Джо Баубиеру Оое Bowbeer), Джиладу Браче (Gilad Bracha), Мэри Кампьон (Mary Campione), Джо Дарси Оое Darcy), Дэвиду Экхардту (David Eckhardt), Джо Фьалли Оое Fialli), Лайзе Френдли (Lisa Friendly), Джеймсу Гослингу (James Gosling), Питеру Хаггеру (Peter Haggar), Брайену КеРl:lигану (Brian Kernighan), Константину Кладко (Konstantin Кladko), Дагу Ли (Doug Lea), Дзенгуа Ли (Zhenghua Li), Тиму Линдхолму (Tim Lindholm), Майку Маклоски (Mike McCloskey), Тиму Пейерлсу (Tim Peierls), Марку Рейнхолду (Mark Reinhold), Кену Расселу (Ken Russell), Биллу Шэннону (ВШ· Shannon), Питеру Стауту (Peter Stout), Филу Уодлеру (Phil Wadler), Давиду Холмсу (David Holmes) и двум анонимным рецензентам. Они внесли множество предложений, кото­рые позволили существенно улучшить книгу и избавили меня от многих затруднений. Все оставшиеся недочеты полностью лежат на моей совести.

Многие мои коллеги, работающие в компании Sun и вне ее, участвовали в техни­ческих дискуссиях, которые улучшили качество этой книги. Среди прочих: Бен Гомес (Ben Gomes), Стефен Грерап (Steffen Grarup), Питер Кесслер (Peter Kessler), Ричард Рода (Richard Roda), Джон Роуз (John Rose) и Дэвид Стаутэмайер (David Stoutamire). Особая благодарность Дагу Ли (Doug Lea), озвучившему многие идеи этой книги. Даг неизменно щедро делился своим временем и знаниями.

Я благодарен Джули Дайникола (Julie Dinicola), Джекки Дусетт (Jacqui Doucette), Майку Хендриксону (Mike Hendrickson), Хизер Ольщик (Heather Olszyk), Трейси Расс (Tracy Russ) и всем сотрудникам Addison-Wesley за их поддержку и Профессионализм. Даже будучи занятыми до предела, они всегда были дружелюбны и учтивы.

Я благодарю Гая Стила (Сиу Steele), написавшего предисловие. Его участие в этом проекте - большая честь для меня.

Наконец, спасибо моей жене Синди Блох (Cindy Вloch), которая своим ободре­нием, а подчас и угрозами помогла мне написать эту книгу. Благодарю за чтение каж­дой статьи в необработанном виде, за помощь при работе с программой Framemaker, за написание предметного указателя и за то, что терпела меня, пока я корпел над этой книгой.

XlV


Содержание


Предисловие

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


1. Введение


2. Создание и уничтожение объектов



  1. Рассмотрите возможность замены конструкторов статическими методами генерации…………………………………………………………......5

  2. Свойство синглтона обеспечивайте закрытым конструктором……………9

  3. Отсутствие экземпляров обеспечивает закрытый конструктор………….11

  4. Не создавайте дублирующих объектов……………………………………...12

  5. Уничтожайте утаревшие ссылки ( на объекты)……………………………..16

  6. Остерегайтесь методов finalize………………………………………………..19


3. Методы, общие для всех объектов


  1. Переопределяя метод euals, соблюдайте общие соглашения………….24

  2. Переопределяя метод equals? Всегда переопределяйте hashCode…...................................................................................................35

  3. Всегда переопределяйте метод toString……………………………………..40

  4. Соблюдайте осторожность при переопределении метода clone………..43

  5. Подумайте над реализацией интерфейса Comparable…………………..........................................................................51


4. Классы и интерфейсы


  1. Сводите к минимуму доступность классов и членов………………………57

  2. Предпочтитайте постоянство………………………………………………….61

  3. Предпочитайте компановку наследованию…………………………………69

  4. Проектируйте и документируйте наследование либо запрещайте его…………………………………………………………………………………..75

  5. Предпочитайте интерфейсы абстрактным классам……………………….80

  6. Используйте интерфейсы только для определения типов……………….85

  7. Предпочитайте статистические классы-члены нестатическим………….87


5. Замена конструкций на языке C


  1. Заменяйте структуру классом………...……………………………………….92

  2. Заменяйте объединение иерархией классов……………………………….94

  3. Заменяйте конструкцию enum классом………………………………………98

  4. Указатель на функцию заменяйте классом и интерфейсом…………….109


6. Методы


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

  2. При необходимости создавайте резервные копии……………………….114

  3. Тщательно проектируйте сигнатуру…………………………………………118

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

  5. Возвращайте массив нулевой длины, а не null……………………………125

  6. Для всех открытых элементов АРI пишите dос-комментарии………….127



7. Общие вопросы программирования


  1. Сводите к минимуму область видимости локальных переменных…….132

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

  3. Если требуются точные ответы, избегайте использования типов float и doubIe……………………………………………………………………………..139

  4. Не используйте строку там, где более уместен иной тип……………….141

  5. При конкатенации строк опасайтесь потери производительности…………144

  6. Для ссылки на объект используйте его интерфейс…………………………...145

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

  8. Соблюдайте осторожность при использовании машинно-зависимых методов……………………………………………………………………………….150

  9. Соблюдайте осторожность при оптимизации………………………………….151

  10. выборе имен придерживайтесь общепринятых соглашений………………..154


8. Исключения


  1. Используйте исключения лишь в исключительных ситуациях……………158

  2. Применяйте обрабатываемые исключения для восстановления, для программных ошибок используйте исключения времени выполнения…………………………………………………………………………161

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

  4. Предпочитайте стандартные исключения……………………………………..165

  5. Инициируйте исключения, соответствующие абстракции…………………..167

  6. Для каждого метода документируйте все инициируемые исключения…………………………………………………………………………..170

  7. В описание исключения добавляйте информацию о сбое…………………..171

  8. Добивайтесь атомарности методов по отношению к сбоям…………………173

  9. Не игнорируйте исключений………………………………………………………175


9. Потоки


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

  2. Избегайте избыточной синхронизации………………………………………….183

  3. Никогда не вызывайте метод wait вне цикла…………………………………..188

  4. Не попадайте в зависимость от планировщика потоков……………………..191

  5. При работе с потоками документируйте уровень безопасности……………194

  6. Избегайте группировки потоков…………………………………………………..197


10. Сериализация


  1. Соблюдайте осторожность при реализации интерфейса SerializabIe…………………………………………………………………………...199

  2. Рассмотрите возможность использования специализированной сериализованной формы…………………………………………………………..204

  3. Метод readObject должен создаваться с защитой…………………………….210

  4. При необходимости создавайте метод readResolve………………………….217


11. Литература


Предисловие

Если бы сослуживец сказал вам: "Моя супруга сегодня вечером готовит дома нечто необычное. Придешь?" (Spouse of me this night today manufactures the unusual meal in а home. You will join?), вам в голову, вероятно, пришли бы сразу три мысли: вас уже пригласили на обед; английский язык не является родным для вашего сослуживца; ну и прежде всего это слишком большое беспокойство.

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

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

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

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

Существует много книг, по которым можно изучать грамматику языка програм­мирования Jаvа, в том числе книги "The Java Prograттiпg Laпguage" авторов Arnold, Gosling и Holmes [ArnoldOO] и "The Java Laпguage Specificatioп" авторов Gosling, Jоу, Bracha и вашего покорного слуги [JLS]. Немало книг посвящено библиотекам и при­кладным интерфейсам, связанным с Jаvа.

Эта книга посвящена третьей теме: общепринятым и эффективным приемам работы с языком Jаvа. На протяжении нескольких лет Джошуа Блох (Joshua Blосk) трудился в компании Sun Microsystems, работая с языком программирования Jаvа, занимаясь расширением и реализацией программного кода. Он изучил большое коли­чество программ, написанных многими людьми, в том числе и мною. 8 настоящей книге он дает дельные советы о том, каким образом структурировать код, чтобы он ра­ботал хорошо, чтобы его могли понять другие люди, чтобы последующие модификации и усовершенствования доставляли меньше головной боли и чтобы ваши программы были приятными, элегантными и красивыми.

Гай А. Стuл-младшuй (Сиу L. Steele Jr.) Берлингтон, шт. Массачусетс Апрель 2001


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


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

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

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

Эта книга предназначена не только для тех, кто занимается разработкой повтор­но используемых компонентов, тем не менее она неизбежно отражает мой опыт в написании таковых, накопленный за последние два десятилетия. Я привык думать в терминах прикладных интерфейсов (API) и предлагаю вам делать то же. Даже если вы не занимаетесь разработкой повторно используемых компонентов, примене­ние этих терминов поможет вам повысить качество ваших программ. Более того, нередко случается писать многократно используемые компоненты, не подозревая об этом: вы создали нечто полезное, поделились своим результатом с приятелем, и вскоре у вас будет уже с полдюжины пользователей. С этого момента вы лишае­тесь возможности свободно менять этот АР! и получаете благодарности за все те усилия, которые потратили на его разработку, когда писали программу в первый раз.

Мое особое внимание к разработке АР! может показаться несколько противо­естественным для ярых приверженцев новых облегченных методик создания програм­много обеспечения, таких как "Экстремальное программирование" [Beck99]. В этих методиках особое значение придается написанию самой простой программы, какая только сможет работать. Если вы пользуетесь одной из этих методик, то обнаружите, что внимание к АРI сослужит вам добрую службу в процессе последующей перестройки программы (refactoring). Основной задачей перестроения является усовер­шенствование структуры системы, а также исключение дублирующего программного кода. Этой цели невозможно достичь, если у компонентов системы нет хорошо спроектированного API.

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


Джошуа Блох

Купертино, шт. Калифорния

Апрель 2001


  1   2   3   4   5   6   7   8   9   ...   22

Похожие:

Tm programming Language Guide iconThe easy programming language

Tm programming Language Guide iconAssembly Language Programming

Tm programming Language Guide iconThe c++ programming language / bjarne stroustrup

Tm programming Language Guide iconNote: The translated text is provided only as a guide to the customer. If any conflict exists between the translated text and the English language version, the English language takes precedent
Примечание: Перевод текста приведен только для Вашего удобства. В случае несоответствия перевода оригинальному тексту на английском...
Tm programming Language Guide icon3 4 Computer Programming Lab 3 4 Electrical and Electronics Lab 3 4 English Language Communications Skills Lab 3 4 it work-Shop 3 4 Total 25 15 56

Tm programming Language Guide iconApproved Combining mathematical programming and constraint programming to solve large scale integrated

Tm programming Language Guide iconConference on Language Development, Language Revitalization and Multilingual Education in Ethnolinguistic Communities

Tm programming Language Guide iconWhat is the relationship between technology and language? How has the global reach of empires past and present affected the spatial distribution of language?

Tm programming Language Guide icon2. "External independent estimation" certificates: History Of Ukraine; Ukrainian Language and Ukrainian Literature; Geography and Foreign language. 3

Tm programming Language Guide iconLanguage Testing in Practice: Designing and Developing Useful Language Tests / Bachman, Lyle F., Palmer, Adrian S. Oxford : Oxford University Press

Разместите кнопку на своём сайте:
Библиотека


База данных защищена авторским правом ©lib.znate.ru 2014
обратиться к администрации
Библиотека
Главная страница