Java Эффективное программирование 3 е издание 3rd Edition Джошуа Блох
Java Эффективное программирование 3 е издание 3rd Edition Джошуа Блох
Java Эффективное программирование 3 е издание 3rd Edition Джошуа Блох
Java Эффективное программирование 3 е издание 3rd Edition Джошуа Блох
1. Java Эффективное программирование 3 е издание
3rd Edition Джошуа Блох install download
https://ebookstep.com/download/ebook-51392948/
Download more ebook from https://ebookstep.com
2. We believe these products will be a great fit for you. Click
the link to download now, or visit ebookstep.com
to discover even more!
Giáo trình Be Internet Awesome 1st Edition Google
http://ebookstep.com/product/giao-trinh-be-internet-awesome-1st-
edition-google/
I ll Be Your Wife Jho Hyo-Eun
http://ebookstep.com/product/i-ll-be-your-wife-jho-hyo-eun/
Marry Me or Be My Wife Ally Jane
http://ebookstep.com/product/marry-me-or-be-my-wife-ally-jane/
The Way I Used to Be 1st Edition Amber Smith
http://ebookstep.com/product/the-way-i-used-to-be-1st-edition-
amber-smith/
3. Osez être trois Dare to be Three Dare Ménage 3 1st
Edition Jeanne St James
http://ebookstep.com/product/osez-etre-trois-dare-to-be-three-
dare-menage-3-1st-edition-jeanne-st-james/
长月无 又名 黑月光拿 BE 本 1st Edition 藤 枝
https://ebookstep.com/download/ebook-50797502/
O Menino Que Se Alimentava de Pesadelos Coleção It s
Okay To Not Be Okay Livro 1 1st Edition Ko Moon Young
http://ebookstep.com/product/o-menino-que-se-alimentava-de-
pesadelos-colecao-it-s-okay-to-not-be-okay-livro-1-1st-edition-
ko-moon-young/
Gesamtausgabe Bd 91 Ergänzungen und Denksplitter IV
ABTEILUNG HINWEISE UND AUFZEICHNUNGEN Martin Heidegger
Mark Michalski Editor
http://ebookstep.com/product/gesamtausgabe-bd-91-erganzungen-und-
denksplitter-iv-abteilung-hinweise-und-aufzeichnungen-martin-
heidegger-mark-michalski-editor/
Handbuch Industrie 4 0 Bd 3 Logistik 2nd Edition Birgit
Vogel-Heuser
http://ebookstep.com/product/handbuch-
industrie-4-0-bd-3-logistik-2nd-edition-birgit-vogel-heuser/
6. При большом количестве параметров конструктора подумайте о
проектном шаблоне Строитель 34 2.3. Получайте синглтон с
помощью закрытого конструктора или типа перечисления 43 2.4.
Обеспечивайте неинстанцируемость с помощью закрытого
конструктора 46 2.5. Предпочитайте внедрение зависимостей
жестко прошитым ресурсам 47 2.6. Избегайте создания
излишних объектов 50 2.7. Избегайте устаревших ссылок на
объекты 53 2.8. Избегайте финализаторов и очистителей 57 2.9.
Предпочитайте try-с-ресурсами использованию try-f inally 63
Глава 3. Методы, общие для всех объектов 67 3.1. Перекрывая
equals, соблюдайте общий контракт 67 3.2. Всегда при
перекрытии equals перекрывайте hashCode 81
3.3. Всегда перекрывайте toString 87 3.4. Перекрывайте метод
clone осторожно 90 3.5. Подумайте о реализации Comparable 100
Глава 4. Классы и интерфейсы 109 4.1. Минимизируйте
доступность классов и членов 109 4.2. Используйте в открытых
классах методы доступа, а не открытые поля 114 4.3.
Минимизируйте изменяемость 117 4.4. Предпочитайте
композицию наследованию 125 4.5. Проектируйте и
документируйте наследование либо запрещайте его 131 4.6.
Предпочитайте интерфейсы абстрактным классам 138 4.7.
Проектируйте интерфейсы для потомков 144 4.8. Используйте
интерфейсы только для определения типов 147 4.9.
Предпочитайте иерархии классов дескрипторам классов 149
4.10. Предпочитайте статические классы-члены нестатическим
152 4.11. Ограничивайтесь одним классом верхнего уровня на
исходный файл 156 Глава 5. Обобщенное программирование 159
5.1. Не используйте несформированные типы 159 5.2.
Устраняйте предупреждения о непроверяемом коде 165 5.3.
Предпочитайте списки массивам 168 5.4. Предпочитайте
обобщенные типы 173 5.5. Предпочитайте обобщенные методы
17 8 5.6. Используйте ограниченные символы подстановки для
повышения гибкости API 183 5.7. Аккуратно сочетайте
обобщенные типы и переменное количество аргументов 190 5.8.
Применяйте безопасные с точки зрения типов гетерогенные
7. контейнеры 196 Глава 6. Перечисления и аннотации 203 6.1.
Используйте перечисления вместо констант int 203 6.2.
Используйте поля экземпляров вместо порядковых значений 216
6.3. Используйте EnumSet вместо битовых полей 217
6.4. Используйте ЕпшпМар вместо индексирования порядковыми
номерами 219 6.5. Имитируйте расширяемые перечисления с
помощью интерфейсов 225 6.6. Предпочитайте аннотации
схемам именования 229 6.7. Последовательно используйте
аннотацию Override 239 6.8. Используйте интерфейсы-маркеры
для определения типов 242 Глава 7. Лямбда-выражения и
потоки 245 7.1. Предпочитайте лямбда-выражения анонимным
классам 245 7.2. Предпочитайте ссылки на методы лямбда-
выражениям 250 7.3. Предпочитайте использовать стандартные
функциональные интерфейсы 252 7.4. Разумно используйте
потоки 257 7.5. Предпочитайте в потоках функции без побочных
эффектов 265 7.6. Предпочитайте коллекции потокам в качестве
возвращаемых типов 271 7.7. Будьте внимательны при
параллелизации потоков 277 Глава 8. Методы 283 8.1.
Проверяйте корректность параметров 283 8.2. При
необходимости создавайте защитные копии 287 8.3. Тщательно
проектируйте сигнатуры методов 292 8.4. Перегружайте методы
разумно 294 8.5. Используйте методы с переменным
количеством аргументов с осторожностью 302 8.6. Возвращайте
пустые массивы и коллекции, а не null 304 8.7. Возвращайте
Optional с осторожностью 307 8.8. Пишите документирующие
комментарии для всех открытых элементов API 312 Глава 9.
Общие вопросы программирования 321 9.1. Минимизируйте
область видимости локальных переменных 321 9.2.
Предпочитайте циклы for для коллекции традиционным циклам
for 324 9.3. Изучите и используйте возможности библиотек 328
9.4. Если вам нужны точные ответы, избегайте float и double 331
9.5. Предпочитайте примитивные типы упакованным
примитивным типам 334 9.6. Избегайте применения строк там,
где уместнее другой тип 338 9.7. Помните о проблемах
8. производительности при конкатенации строк 341 9.8. Для
ссылки на объекты используйте их интерфейсы 342 9.9.
Предпочитайте интерфейсы рефлексии 344 9.10. Пользуйтесь
машинно-зависимыми методами осторожно 348 9.11.
Оптимизируйте осторожно 350 9.12. Придерживайтесь
общепринятых соглашений по именованию 353 Глава 10.
Исключения 359 10.1. Используйте исключения только в
исключительных ситуациях 359 10.2. Используйте для
восстановления проверяемые исключения, а для программных
ошибок — исключения времени выполнения 362 10.3. Избегайте
ненужных проверяемых исключений 365 10.4. Предпочитайте
использовать стандартные исключения 367 10.5. Генерируйте
исключения, соответствующие абстракции 370 10.6.
Документируйте все исключения, которые может генерировать
метод 372 10.7. Включайте в сообщения информацию о сбое 374
10.8. Добивайтесь атомарности сбоев 376 10.9. Не игнорируйте
исключения 378 Глава 11. Параллельные вычисления 381 11.1.
Синхронизируйте доступ к совместно используемым изменяемым
данным 381 11.2. Избегайте излишней синхронизации 386 11.3.
Предпочитайте исполнителей, задания и потоки данных потокам
исполнения 394 11.4. Предпочитайте утилиты параллельности
методам wait и notify 396 11.5. Документируйте безопасность с
точки зрения потоков 402 11.6. Аккуратно применяйте
отложенную инициализацию 406 11.7. Избегайте зависимости от
планировщика потоков 409
Глава 12. Сериализация 413 12.1. Предпочитайте альтернативы
сериализации Java 413 12.2. Реализуйте интерфейс Serializable
крайне осторожно 418 12.3. Подумайте о применении
пользовательской сериализованной формы 421 12.4. Создавайте
защищенные методы readOb j ect 429 12.5. Для управления
экземпляром предпочитайте типы перечислений методу
readResolve 435 12.6. Подумайте о применении прокси-агента
сериализации вместо сериализованных экземпляров 440
Приложение. Соответствие статей второго издания разделам
9. третьего издания 445 Список литературы 449 Предметный
указатель 453
Моей семье: Синди, Тиму и Мэтту
Вступительное слово Если ваш коллега скажет вам ‘‘Моя супруга
сегодня перед ночью изготовит дома необычную еду. Не
объединишься с нами в поедании?”, то вам в голову, вероятно,
придут три мысли: вас пригласили на ужин; ваш коллега явно
иностранец; ну, а первым вашим ощущением будет
озадаченность. Если вы когда-либо изучали иностранный язык, а
затем пробовали пользоваться им за пределами учебной
аудитории, то вы понимаете, что есть три вещи, которые
необходимо знать: каким образом структурирован изучаемый
язык (его грамматику), какими словами обозначаются вещи, о
которых вы хотите рассказать (словарь), а также общепринятые
и эффективные способы говорить о повседневных вещах
(лексические обороты). На занятиях слишком часто уделяется
внимание только первым двум темам, и позже вы
обнаруживаете, что настоящие носители изучаемого вами языка
прячут улыбку, пытаясь понять ваши обороты. В случае языка
программирования все обстоит почти так же. Вам необходимо
понимать основы языка: является он алгоритмическим,
функциональным или объектно-ориентированным. Вам нужно
знать словарь языка: какие структуры данных, операции и
возможности предоставляют язык и его стандартные
библиотеки. Вам необходимо также ознакомиться с
общепринятыми и эффективными способами структурирования
вашего кода. В книгах, посвященных языкам программирования,
часто освещаются лишь первые два вопроса, а эффективные
приемы работы с языком если и обсуждаются, то лишь крайне
бегло. Возможно, дело в том, что писать на первые две темы
гораздо проще. Грамматика и словарь — это свойства самого
языка, тогда как способ его использования характеризует скорее
людей, которые этим языком пользуются. Например, язык
программирования Java — объектно-ориентированный язык с
10. единичным наследованием, поддерживающий императивный
(ориентированный на инструкции) стиль программирования
каждого метода. Его библиотеки ориентированы на поддержку
графического вывода, работы с сетью, распределенных
вычислений и безопасности. Однако как использовать этот язык
на практике наилучшим образом?
14 ВСТУПИТЕЛЬНОЕ СЛОВО Имеется и другой аспект.
Программы, в отличие от произнесенных предложений, а также
большинства книг и журналов, со временем меняются. Обычно
недостаточно создать код, который эффективно работает и
легко может быть понят другими людьми. Нужно еще и
организовать этот код таким образом, чтобы его можно было
легко модифицировать. Практически для любой задачи Т
имеется с десяток вариантов написания решающего ее кода. Из
этого десятка семь окажутся запутанными, неэффективными или
непонятными для читающего их человека. Но какой из
оставшихся трех вариантов будет более всего похож на
исходный текст, который потребуется в следующем году при
разработке новой версии программы, решающей задачу Т'1 Есть
масса книг, по которым можно изучать грамматику языка
программирования Java, включая The Java™ Programming
Language Арнольда (Arnold), Гослинга (Gosling) и Холмса
(Holmes) или The Java™ Language Specification Гослинга, Джоя
(Joy), Стила (Steele), Брача (Bracha) и Бакли (Buckley) [25].
Имеется также множество книг, посвященных библиотекам и
API, связанным с языком программирования Java. Эта книга
посвящена третьей теме: эффективному использованию языка
Java. Джошуа Блох провел несколько лет в Sun Microsystems,
занимаясь расширением, реализацией и применением языка
программирования Java; он также прочел огромное количество
исходных текстов, написанных многими программистами, в том
числе мной. Приведя свои знания и опыт в систему, он дает
отличные советы о том, каким образом структурировать код,
чтобы он эффективно работал, был понятен другим
программистам, чтобы последующие его изменения и
11. усовершенствования доставляли как можно меньше хлопот и
даже по возможности чтобы ваши программы были к тому же
элегантными и красивыми. Гай Л. Стил-младишй (Guy L. Steele
Jr.) Берлингтон, Массачусетс Апрель 2001
Предисловие ii ■ . ; ■ Предисловие к третьему изданию В 1997
году, когда язык Java был еще новинкой, отец Java, Джеймс
Гослинг (James Gosling), описал его как “весьма простой язык
для синих воротничков” [14]. Примерно в то же время отец C++,
Бьярне Страуструп (Bjame Stroustrup), описал C++ как
“мультипарадигменный язык”, который “сознательно сделан
отличным от языков, созданных для поддержки единого способа
написания программ” [47]. Касаясь языка программирования
Java, Страуструп предупредил: Большая часть относительной
простоты языка программирования Java — как в большинстве
новых языков — отчасти иллюзия, а отчасти результат его
незавершенности. Со временем размеры и сложность Java
значительно вырастут. Его размер удвоится или утроится, как
увеличится и количество зависящих от реализации расширений
или библиотек [46]. Сейчас, двадцать лет спустя, можно сказать,
что и Гослинг, и Страуструп были правы. Java теперь большой и
сложный язык программирования с множеством абстракций для
множества вещей — от параллельного выполнения до итераций
и представления даты и времени. Мне все еще нравится Java,
хотя мой пыл несколько остыл с его ростом. Учитывая
увеличение размера и сложности языка, все более важной
является необходимость руководства по этому языку
программирования, охватывающего наилучшие современные
практики его применения. В третьем издании данной книги я
сделал все, чтобы предоставить вам именно такое руководство.
Я надеюсь, что это издание, оставаясь верным духу первых двух
изданий, удовлетворит всем вашим потребностям. Сан-Хосе,
Калифорния Ноябрь 2017 P.S. Было бы упущением не упомянуть
о передовой практике, которая ныне отнимает изрядное
количество моего времени. С момента рождения нашей области
в 1950-е годы мы, программисты, свободно обменивались и
12. перепроектировали API друг друга. Эта практика имела и имеет
решающее значение
16 ПРЕДИСЛОВИЕ для быстрых успехов компьютерных
технологий. Я активно работаю для того, чтобы сохранить эту
свободу и далее [9], и призываю вас присоединиться ко мне.
Если мы сохраним право повторной реализации API друг друга,
это будет иметь решающее значение для дальнейшего здоровья
всей нашей отрасли. Предисловие ко второму изданию С тех пор
как я написал первое издание этой книги в 2001 году, в
платформе Java произошло много изменений, и я решил, что
настала пора написать второе издание. Наиболее значимыми
изменениями стали добавление обобщенных типов, типов
перечислений, комментариев, автоматической инкапсуляции,
циклов по диапазону в Java 5. Новшеством стало добавление
новой библиотеки java. util. concurrent, также появившейся в
Java 5. Мне повезло, что вместе с Гиладом Брачей я смог
возглавить команду, разрабатывавшую новые возможности
языка. Мне также повезло работать в команде,
разрабатывавшей библиотеку параллельных вычислений и
возглавляемой Дугом Ли (Doug Lea). Другим значительным
изменением платформы стало ее оснащение современными
интегрированными средами разработки, такими как Eclipse,
IntelliJ IDEA и NetBeans, а также инструментами статического
анализа, как, например, FindBugs. Хотя я и не принимал в этом
участия, но смог извлечь для себя огромную выгоду и узнал, как
все эти Инструменты влияют на опыт разработки на языке
программирования Java. В 2004 году я перешел из Sun в Google,
однако продолжал принимать участие в разработке платформы
Java в течение последних четырех лет, работая в области API
для параллельных вычислений и коллекций, используя офисы
Google и Java Community Process. Я также имел удовольствие
использовать платформу Java для разработки библиотек для
внутреннего использования в Google. Теперь я знаю, что
чувствуют пользователи. Когда в 2001 году я писал первое
издание книги, моей основной целью было поделиться моим
13. опытом с читателями, чтобы они могли повторить мои успехи и
избежать моих неудач. Новый материал продолжает традицию
использования реальных примеров из библиотек платформы
Java. Успех первой редакции превзошел все мои ожидания, и,
освещая новый материал, я сделал все возможное, чтобы
сохранить дух предыдущего издания. Избежать увеличения
книги было невозможно — и теперь в ней вместо 57 уже 78
разделов. И я не просто добавил 23 новых раздела, а тщательно
переработал исходное издание, в том числе удалив некоторые
ставшие неактуальными разделы. В приложении вы можете
увидеть, как соотносятся материалы данного издания с
материалом первого издания.
ПРЕДИСЛОВИЕ К ПЕРВОМУ ИЗДАНИЮ 17 В предисловии к
первому изданию я писал, что язык программирования Java и
его библиотеки очень способствуют качеству и
производительности труда и что работать с ними — одно
удовольствие. Изменения в версиях 5 и 6 сделали их еще лучше.
Сейчас платформа Java гораздо больше и сложнее, чем в 2001
году, но, познакомившись с ее проектными шаблонами и
идиомами, использующими новые возможности, вы улучшите
свои программы и упростите свою жизнь. Надеюсь, что это
издание передаст вам мой энтузиазм и поможет более
эффективно и с большим удовольствием использовать
платформу и ее новые возможности. Сан-Хосе, Калифорния
Апрель 2008 Предисловие к первому изданию В 1996 году я
направился на запад работать в компании JavaSoft (как она
тогда называлась), поскольку для меня было очевидно, что
именно там происходят главные события. На протяжении пяти
лет я работал архитектором библиотек для платформы Java. Я
проектировал, реализовывал и сопровождал множество
библиотек, а также давал консультации по многим другим
библиотекам. Руководить этими библиотеками в ходе
становления платформы языка Java — такая возможность
выпадает только раз в жизни. Не будет преувеличением сказать,
что я имел честь работать с некоторыми великими
14. программистами нашего поколения. В процессе работы я узнал о
языке программирования Java очень многое: что хорошо
работает, а что — нет и как пользоваться языком и его
библиотеками для получения наиболее эффективного
результата. Эта книга является попыткой поделиться с вами
моим опытом, чтобы вы могли повторить мои успехи и избежать
моих ошибок. Формат книги я позаимствовал из книги Скотта
Мейерса (Scott Meyers) Effective C++ [33], состоящей из
разделов, каждый из которых посвящен одному конкретному
правилу, позволяющему улучшить программы и проекты. Такой
формат кажется мне необычайно эффективным, и, надеюсь, вам
он также понравится. Во многих случаях я иллюстрирую
разделы реальными примерами из библиотек платформы Java.
Говоря, что нечто можно сделать лучше, я стараюсь привести
исходный текст, который я писал сам, однако иногда я брал
разработки моих коллег. Приношу мои искренние извинения,
если, несмотря на все старания, я кого-либо при этом обидел.
Отрицательные примеры приведены не для того, чтобы кого-то
опорочить, а в соответствии с духом сотрудничества, чтобы все
мы могли извлечь пользу из опыта тех, кто прошел этот путь
ранее.
18 ПРЕДИСЛОВИЕ Хотя эта книга предназначена не только для
людей, занимающихся разработкой повторно используемых
компонентов, она неизбежно отражает мой опыт в написании
таковых, накопленный за последние два десятилетия. Я привык
думать в терминах интерфейсов прикладного программирования
(API) и предлагаю вам поступать так же. Даже если вы не
занимаетесь разработкой повторно используемых компонентов,
мышление в соответствующих терминах может повысить
качество разрабатываемых вами программ. Более того, нередко
случается писать многократно используемые компоненты, даже
не подозревая об этом: вы написали что-то полезное,
поделились своим результатом с приятелем, и вскоре
оказывается, что у вашего кода уже с полдюжины
пользователей. С этого момента вы лишаетесь возможности
15. свободно менять этот API и благодарите сами себя за усилия,
которые потратили на его первоначальную разработку и
которые позволили получить качественный продукт. Мое особое
внимание к разработке API может показаться несколько
противоестественным для ярых приверженцев новых
облегченных методик разработки программного обеспечения,
таких как “Экстремальное программирование” [2]. В этих
методиках особое значение придается написанию самой простой
программы, какая только сможет работать. Если вы пользуетесь
одной из таких методик, то вскоре обнаружите, что особое
внимание к разработке API вернется сторицей при последующем
рефакторинге программы. Основной задачей рефакторинга
является усовершенствование системной структуры, а также
исключение дублирования кода. Этой цели невозможно достичь,
если у системных компонентов нет хорошо продуманного и
спроектированного API. Ни один язык не идеален, но некоторые
из них великолепны. Я обнаружил, что язык программирования
Java и его библиотеки в огромной степени способствуют
повышению качества и производительности труда и что
работать с ними — одно удовольствие. Надеюсь, эта книга
сможет передать вам мой энтузиазм и сделает вашу работу с
языком Java более эффективной и приятной. Купертино,
Калифорния Апрель 2001
Благодарности Благодарности к третьему изданию Я благодарю
читателей первых двух изданий за их восторженный прием этой
книги и принятие ее идей в свои сердца, а также за отзывы о
том, какое положительное влияние она оказала на них и их
работу. Я благодарю тех преподавателей, которые использовали
эту книгу в своих учебных курсах, а также те команды
программистов, которые приняли ее как руководство в
повседневной работе. Я благодарю всю команду Addison-Wesley
и Pearson за их отзывчивость, профессионализм и терпение. В
любых условиях мой редактор Грег Денч (Greg Doench)
оставался идеальным редактором и истинным джентльменом.
Боюсь, что у него прибавилось седин в результате работы над
16. этой книгой, и смиренно прошу у него за это прощения.
Менеджер проекта Джули Наиль (Julie Nahil) и редактор проекта
Дана Вилсон (Dana Wilson) превзошли все мои ожидания и
надежды: всегда прилежны, оперативны, организованны и
дружески настроены — как и редактор Ким Вимпсетт (Kim
Wimpsett). Я вновь получил лучшую команду рецензентов, какую
только можно вообразить, и я искренне благодарен каждому из
них. Вот состав основной группы, которая подробно
проанализировала каждую главу: Синди Блох (Cindy Bloch),
Брайан Керниган (Brian Kernighan), Кевин Бурриллион (Kevin
Bourrillion), Джо Боубир (Joe Bowbeer), Уильям Чарджин (William
Chargin), Джо Дарси (Joe Darcy), Брайан Гётц (Brian Goetz), Тим
Хеллоран (Tim Halloran), Стюарт Маркс (Stuart Marks), Тим
Пейерлс (Tim Peierls) и Йошики Шибата (Yoshiki Shibata). Кроме
того, свой вклад внесли такие рецензенты, как Маркус Биль
(Marcus Biel), Дэн Блох (Dan Bloch), Бет Боттос (Beth Bottos),
Мартин Бух- хольц (Martin Buchholz), Майкл Дайамонд (Michael
Diamond), Чарли Гэррод (Charlie Garrod), Том Хоутин (Tom
Hawtin), Дуг Ли (Doug Lea), Алексей Ши- пилёв (Aleksey Shipi^v),
Лу Вассерман (Lou Wasserman) и Питер Вайнбергер (Peter
Weinberger). Их отзывы содержали многочисленные
предложения по исправлению материала книги, что привело к
существенному улучшению книги и спасло меня от множества
затруднений.
20 БЛАГОДАРНОСТИ Особую благодарность заслужили Уильям
Чарджин, Дуг Ли и Тим Пейерлс, которые помогали в “обкатке”
многих идей в этой книге. Уильям, Дуг и Тим неизменно щедро
делились своими временем и знаниями. Наконец, я благодарю
мою жену, Синди Блох, которая не только с пониманием
относилась к моей занятости, но и помогала во всем — от
чтения черновиков до подготовки предметного указателя;
словом, во всех тех неприятных мелочах, которые неизбежно
сопутствуют любому большому проекту. Благодарности ко
второму изданию Я благодарю читателей первого издания за их
восторженный прием этой книги и принятие ее идей в свои
17. сердца, а также за отзывы о том, какое положительное влияние
она оказала на них и их работу. Я благодарю тех
преподавателей, которые использовали эту книгу в своих
учебных курсах, а также те команды программистов, которые
приняли ее как руководство в повседневной работе. Я
благодарю всю команду Addison-Wesley за их отзывчивость,
профессионализм и терпение. В любых условиях мой редактор
Грег Денч (Greg Doench) оставался идеальным редактором и
истинным джентльменом. Менеджер проекта Джули Наиль (Julie
Nahil) всегда была такой, какой должен быть менеджер проекта:
прилежной, оперативной, организованной и дружески
настроенной — как и редактор Барбара Вуд (Barbara Wood). Я
вновь получил лучшую команду рецензентов, какую только
можно вообразить, и я искренне благодарен каждому из них.
Вот состав основной группы, которая подробно
проанализировала каждую главу: Лекси Бугер (Lexi Baugher),
Синди Блох (Cindy Bloch), Бет Боттос (Beth Bottos), Джо Боубир
(Joe Bowbeer), Брайан Гётц (Brian Goetz), Тим Хеллоран (Tim
Halloran), Брайан Керниган (Brian Kernighan), Роб Кёнигсберг
(Rob Konigsberg), Тим Пейерлс (Tim Peierls), Билл Паф (Bill Pugh),
Йошики Шибата (Yoshiki Shibata), Питер Стаут (Peter Stout),
Питер Вайнбергер (Peter Weinberger) и Франк Еллин (Frank
Yellin). Кроме того, свой вклад внесли такие рецензенты, как
Пабло Беллвер (Pablo Bellver), Дэн Блох (Dan Bloch), Дэн
Борнстейн (Dan Bornstein), Кевин Бурриллион (Kevin Bourrillion),
Мартин Буххольц (Martin Buchholz), Джо Дарси (Joe Darcy), Нил
Гафтер (Neal Gafter), Лоренс Гонсальвес (Laurence Gonsalves),
Аарон Гринхаус (Aaron Greenhouse), Барри Хайес (Barry Hayes),
Питер Джонс (Peter Jones), Анжелика Ланжер (Angelika Langer),
Дуг Ли (Doug Lea), Боб Ли (Bob Lee), Джереми Мэнсон (Jeremy
Manson), Том Мэй (Tom Мау), Майк Мак-Клоски (Mike McCloskey),
Андрей Терещенко (Andriy Tereshchenko) и Пол Тима (Paul Тута).
Их отзывы содержали многочисленные
БЛА ГОДА РНОСТИ К ПЕРВОМУ ИЗД А НИЮ 21 предложения по
исправлению материала книги, что привело к существенному
18. улучшению книги и спасло меня от множества затруднений. Все
оставшиеся в книге огрехи — на моей совести. Особую
благодарность заслужили Дуг Ли и Тим Пейерлс, которые
помогали в “обкатке” многих идей в этой книге. Дуг и Тим
неизменно щедро делились своими временем и знаниями. Я
благодарю моего менеджера в Google, Прабху Кришну (Prabha
Krishna), за ее неизменную поддержку и содействие. Наконец, я
благодарю мою жену, Синди Блох, которая не только с
пониманием относилась к моей занятости, но и помогала во всем
— от чтения черновиков до работы с Framemaker и подготовки
предметного указателя. Благодарности к первому изданию Я
благодарю Патрика Чана (Patrick Chan) за предложение написать
эту книгу и за то, что он увлек этой идеей управляющего
редактора серии Лизу Френдли (Lisa Friendly); Тима Линдхольма
(Tim Lindholm), технического редактора серии; а также Майка
Хендриксона (Mike Hendrickson), исполнительного редактора
Addison-Wesley. Я благодарю вас, Лиза, Тим и Майк, за то, что
вы помогли мне довести этот проект до конца, за ваши
сверхчеловеческое терпение и непоколебимую веру в то, что
однажды я напишу эту книгу. Я благодарю Джеймса Гослинга
(James Gosling) и его команду за создание того, о чем я смог
написать, а также многих разработчиков платформы Java,
шедших по стопам Джеймса. В частности, я благодарю моих
коллег по Sun Java Platform Tools and Libraries Group за идеи и
поддержку. Эта команда включает Эндрю Беннетта (Andrew
Bennett), Джо Дарси (Joe Darcy), Нила Гафте- ра (Neal Gafter),
Ирис Гарсию (Iris Garcia), Константина Кладько (Konstantin
Kladko), Яна Литтла (Ian Little), Майка Мак-Клоски (Mike
McCloskey) и Марка Рейнхольда (Mark Reinhold). Должен
упомянуть также бывших членов команды — Дзенхуа Ли
(Zhenghua Li), Билла Мэддокса (Bill Maddox) и Навиина Сандживу
(Naveen Sanjeeva). Я благодарю моего менеджера Эндрю
Беннета (Andrew Bennett) и директора Ларри Абрамса (Larry
Abrahams) за их полную и активную поддержку этого проекта. Я
благодарю Рича Грина (Rich Green), вице-президента Java
Software, за создание условий, в которых инженеры могут
19. мыслить творчески и публиковать свои работы. Судьба подарила
мне лучшую команду рецензентов, о какой только можно
мечтать, и я искренне благодарен всем ее членам. Вот состав
этой команды: Эндрю Беннетт (Andrew Bennett), Синди Блох
(Cindy Bloch), Дэн Блох (Dan
22 БЛАГОДАРНОСТИ Bloch), Бет Боттос (Beth Bottos), Джо
Боубир (Joe Bowbeer), Гилад Брача (Gilad Bracha), Мэри Кампьон
(Mary Campione), Джо Дарси (Joe Darcy), Дэвид Экхардт (David
Eckhardt), Джо Фиалли (Joe Fialli), Лиза Френдли (Lisa Friendly),
Джеймс Гослинг (James Gosling), Питер Хаггар (Peter Haggar),
Дэвид Холмс (David Holmes), Брайан Керниган (Brian Kernighan),
Константин Кладько (Konstantin Kladko), Дуг Ли (Doug Lea),
Дзенхуа Ли (Zhenghua Li), Тим Линд- хольм (Tim Lindholm), Майк
Мак-Клоски (Mike McCloskey), Тим Пейерлс (Tim Peierls), Марк
Рейнхольд (Mark Reinhold), Кен Расселл (Ken Russell), Билл
Шеннон (Bill Shannon), Питер Стаут (Peter Stout), Фил Уадлер
(Phil Wadler) и два рецензента, оставшихся анонимными. Они
сделали многочисленные предложения, которые привели к
существенным улучшениям книги и спасли меня от множества
затруднений. Все оставшиеся в книге огрехи — на моей совести.
Многочисленные коллеги как из 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 за их
поддержку и профессионализм. Даже при невероятно плотном
графике они всегда оставались дружелюбны и гостеприимны. Я
благодарю Гая Стила (Guy Steele) за вступительное слово к
20. книге. Я польщен, что он решил принять участие в этом проекте.
Наконец, я благодарю мою жену, Синди Блох, которая не только
с пониманием относилась к моей занятости, но и помогала во
всем — от чтения черновиков до работы с Framemaker и
подготовки предметного указателя. Ждем ваших отзывов! Вы,
читатель этой книги, и есть главный ее критик. Мы ценим ваше
мнение и хотим знать, что было сделано нами правильно, что
можно было сделать лучше и что еще вы хотели бы увидеть
изданным нами. Нам интересны любые ваши замечания в наш
адрес. Мы ждем ваших комментариев и надеемся на них. Вы
можете прислать нам бумажное или электронное письмо либо
просто посетить наш веб-сайт и оставить свои замечания там.
Одним словом, любым удобным для вас способом
ЖДЕМ ВАШИХ ОТЗЫВОВ! 23 дайте нам знать, нравится ли вам
эта книга, а также выскажите свое мнение о том, как сделать
наши книги более интересными для вас. Отправляя письмо или
сообщение, не забудьте указать название книги и ее авторов, а
также свой обратный адрес. Мы внимательно ознакомимся с
вашим мнением и обязательно учтем его при отборе и
подготовке к изданию новых книг. Наши электронные адреса: E-
mail: info@dialektika.com WWW: http://www.dialektika.com
ГЛАВА 1 Введение Эта книга разработана с тем, чтобы помочь
вам максимально эффективно использовать возможности языка
программирования Java и его основных библиотек java. lang,
java.util и java. io, а также подпакетов наподобие java .util.
concurrent и java. util. function. Прочие библиотеки
рассматриваются эпизодически. Эта книга состоит из 90
разделов, каждый из которых посвящен одному правилу. В этих
правилах собран опыт, который лучшие, наиболее опытные
программисты считают весьма полезным. Эти разделы
сгруппированы в одиннадцать глав, каждая из которых
охватывает один из аспектов проектирования программного
обеспечения. Книга не предназначена для чтения от корки до
корки: каждый раздел более или менее самодостаточен.
21. Разделы снабжены перекрестными ссылками, позволяющими
пройти собственный путь через книгу. Со времени публикации
предыдущего издания книги к платформе Java было добавлено
немало новых функциональных возможностей. Большинство
разделов этой книги тем или иным способом используют эти
возможности. В приведенной ниже таблице показано, где
именно в первую очередь освещены те или иные ключевые
особенности языка. Функциональная возможность Разделы
Версия Java Лямбда-выражения 7.1-7.3 8 Потоки 7.4-7.7 8
Использование класса Optional 8.7 8 Методы по умолчанию в
интерфейсах 4.7 8 try-с-ресурсами 2.9 7 @SafeVarargs 5.7 7
Модули 4.1 9 Большинство разделов проиллюстрированы
примерами программ. Ключевой особенностью этой книги
является то, что она содержит примеры кода,
26 ГЛАВА I ВВЕДЕНИЕ иллюстрирующие многие проектные
шаблоны и идиомы. Там, где это уместно, представлены
перекрестные ссылки на стандартный справочник в этой области
[12]. Многие разделы содержат один или несколько примеров
программ, иллюстрирующих некоторые практики, которых
следует избегать. Такие примеры, иногда известные как
“антишаблоны” (антипаттерны), ясно указываются с помощью
комментариев наподобие // Никогда этого не делайте! В каждом
случае поясняется, почему этот пример плох, и предлагается
альтернативный подход. Эта книга не для начинающих:
предполагается, что вы уже знакомы с Java. Если это не так,
обратитесь к одной из множества книг для новичков, таких как
Java Precisely Питера Сестофта (Peter Sestoft) [41 ]. Хотя данная
книга должна быть доступна любому обладающему рабочим
знанием языка, она должна дать пищу для размышлений даже
самым “продвинутым” программистам. Большинство правил этой
книги вытекают из нескольких основополагающих принципов.
Ясность и простота имеют первостепенное значение.
Пользователь компонента никогда не должен удивляться его
поведению. Компоненты должны быть как можно меньшими, но
не меньше, чем нужно. (В этой книге термин компонент
22. относится к любому повторно используемому элементу
программы, от отдельных методов до сложных каркасов,
состоящих из нескольких пакетов.) Код должен повторно
использоваться, а не копироваться. Зависимости между
компонентами должны быть сведены к минимуму. Ошибки
должны обнаруживаться немедленно после того, как они
сделаны, в идеале — во время компиляции. Хотя правила из
этой книги и не применяются постоянно во время работы, в
подавляющем большинстве случаев они характеризуют лучшие
практики программирования. Вы не должны следовать этим
правилам рабски и без размышлений, но нарушать их следует
лишь изредка и по уважительной причине. Обучение искусству
программирования, как и большинству других дисциплин,
состоит из, во-первых, обучения правилам и, во-вторых,
обучения, когда эти правила нарушать. По большей части эта
книга не посвящена вопросам производительности. Речь идет о
написании ясных, правильных, полезных, надежных, гибких и
легких в обслуживании и поддержке программ. Если вы можете
написать такую программу, то добиться требуемой
производительности — обычно относительно простой вопрос
(раздел 9.11). В некоторых разделах обсуждаются проблемы
производительности и в некоторых из них приводятся цифры,
эту производительность характеризующие. Эти цифры, которые
обычно дополнены словами
ГЛАВА I ВВЕДЕНИЕ 27 “на моей машине”, следует рассматривать
как в лучшем случае очень приблизительные. Для тех, кому это
важно: у меня старенькая домашняя машина с четырехъядерным
3.5 ГГц процессором Intel Core i7-4770K с 16 Гбайтами DDR3-
1866 CL9 RAM, работающая с Azul’s Zulu 9.0.0.15-версией
OpenJDK, с операционной системой Microsoft Windows 7
Professional SP1 (64-bit). При обсуждении возможностей языка
программирования Java и его библиотек иногда необходимо
сослаться на определенные версии. Для удобства в этой книге
используются краткие названия вместо официальных. В
приведенной далее таблице показано соответствие
23. официальных названий используемым в книге кратким
названиям. Официальное название выпуска Краткое название
JDK 1.0.x Java 1.0 JDK 1.1.x Java 1.1 Java 2 Platform, Standard
Edition, vl .2 Java 2 Java 2 Platform, Standard Edition, vl.3 Java 3
Java 2 Platform, Standard Edition, vl.4 Java 4 Java 2 Platform,
Standard Edition, v5.0 Java 5 Java Platform, Standard Edition 6 Java
6 Java Platform, Standard Edition 7 Java 7 Java Platform, Standard
Edition 8 Java 8 Java Platform, Standard Edition 9 Java 9 Примеры в
книге достаточно полные, но удобочитаемость
предпочтительнее полноты. В них используются классы из
пакетов java. util и java. io. Для компиляции примеров,
возможно, придется добавить одно или несколько объявлений
импорта или иной подобный шаблон. Веб-сайт книги по адресу
http: //joshbloch. com/effectivejava содержит расширенную
версию каждого примера, который можно скомпилировать и
запустить. По большей части в этой книге используются
технические термины, определенные в книге The Java Language
Specification, Java SE 8 Edition [25]. Несколько терминов
заслуживают отдельного упоминания. Язык поддерживает
четыре разновидности типов: интерфейсы (включая аннотации),
классы (включая перечисления), массивы и примитивы. Первые
три называются ссылочными типами. Экземпляры класса и
массивы являются объектами', примитивные значения таковыми
не являются. Члены класса включают его поля, методы, классы-
члены и интерфейсы-члены. Сигнатура метода состоит из его
имени и типов его формальных параметров; сигнатура не
содержит тип возвращаемого методом значения.
28 ГЛАВА I ВВЕДЕНИЕ В этой книге используется несколько
терминов, отличных от используемых в упомянутой книге. Здесь
термин наследование (inheritance) используется как синоним для
создания подклассов (subclassing). Вместо использования
термина наследования для интерфейсов книга просто говорит,
что класс реализует интерфейс или что один интерфейс
расширяет другой. Чтобы описать уровень доступа,
применяемый при отсутствии явного указания, в книге
24. используется традиционный доступ закрытый на уровне пакета
(package-private) вместо технически правильного доступа пакета
(package access) [25, 6.6.1]. Также здесь используется несколько
технических терминов, которые не определены в упомянутой
книге. Термин экспортируемый API, или просто API, ссылается
на классы, интерфейсы, конструкторы, члены и
сериализованные формы, с помощью которых программист
обращается к классу, интерфейсу или пакету. (Аббревиатуре
“API”, означающей интерфейс прикладного программирования,
отдается предпочтение перед термином интерфейс, чтобы
избежать путаницы с конструкцией языка с этим названием.)
Программист, который пишет программу, которая использует
API, именуется пользователем API. Класс, реализация которого
использует API, является клиентом API. Классы, интерфейсы,
конструкторы, члены и сериализованные формы вместе
называются элементами API. Экспортированный API состоит из
элементов API, которые доступны за пределами пакета, в
котором определен API. Это те элементы API, которые может
использовать любой клиент и которые автор API обязуется
поддерживать. Не случайно они также являются элементами,
для которых утилита Javadoc генерирует документацию в
режиме работы по умолчанию. Грубо говоря, экспортируемый
API пакета состоит из открытых и защищенных членов и
конструкторов каждого открытого класса или интерфейса в
пакете. В Java 9 в платформу была добавлена модульная
система (module system). Если библиотека использует
модульную систему, ее экспортированный API представляет
собой объединение экспортированных API всех пакетов,
экспортируемых объявлением модуля библиотеки.
ГЛАВА Создание и уничтожение объектов В этой главе
рассматриваются создание и уничтожение объектов: когда и как
их создавать, когда и как избегать их создания, как обеспечить
их своевременное уничтожение и как управлять любыми
действиями по очистке, которые должны предшествовать
уничтожению. 2.1. Рассмотрите применение статических
25. фабричных методов вместо конструкторов Традиционный
способ, которым класс позволяет клиенту получить экземпляр,
— предоставление открытого (public) конструктора. Существует
еще один метод, который должен быть частью инструментария
каждого программиста. Класс может предоставить открытый
статический фабричный метод'. Вот простой пример из Boolean
(упакованный примитивный класс boolean). Этот метод
преобразует значение примитива типа boolean в ссылку на
объект Boolean: public static Boolean valueOf(boolean b) ( return b
? Boolean.TRUE : Boolean.FALSE; ) Обратите внимание, что
статический фабричный метод — это не то же самое, что
проектный шаблон Фабричный Метод (Factory Method) из [12].
Статический фабричный метод, описанный в этом разделе, не
имеет прямого эквивалента в [12]. Класс может предоставить
своим клиентам статические фабричные методы вместо
открытых (public) конструкторов (или в дополнение к ним).
Такое 1 Статический фабричный метод — это статический
метод, который возвращает экземпляр класса. — Примеч. ред.
30 ГЛАВА 2 СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ
предоставление статического фабричного метода вместо
открытого конструктора имеет как преимущества, так и
недостатки. Одним из преимуществ статических фабричных
методов является то, что, в отличие от конструкторов, они
имеют имена. Если параметры конструктора не описывают
возвращаемые объекты (и сами по себе не являются ими), то
хорошо подобранное имя статического фабричного метода легче
в использовании, а получающийся в результате код оказывается
более удобочитаемым. Например, вместо конструктора
Biginteger (int, int, Random), который возвращает объект
Biginteger, который, вероятно, представляет собой простое
число, было бы лучше использовать статический фабричный
метод с именем Biginteger .probablePrime (этот метод был
добавлен в Java 4). Класс может иметь только один конструктор
с заданной сигнатурой. Программисты, как известно, обходят это
ограничение путем предоставления конструкторов, списки
26. параметров которых отличаются только порядком типов их
параметров. Это плохая идея. Пользователь такого API не
сможет вспомнить, какой конструктор ему нужен, и в конечном
итоге будет ошибаться и вызывать неверный конструктор.
Программисты, читающие код с такими конструкторами, без
документации не будут знать, что делает этот код. Благодаря
наличию имен на статические фабричные методы не
накладывается ограничение из предыдущего абзаца. В тех
случаях, когда классу, как представляется, требуется несколько
конструкторов с одинаковой сигнатурой, замените конструкторы
статическими фабричными методами с тщательно подобранными
именами, чтобы подчеркнуть их различия. Вторым
преимуществом статических фабричных методов является то,
что, в отличие от конструкторов, они не обязаны создавать
новые объекты при каждом вызове. Это позволяет
неизменяемым классам (раздел 4.3) использовать
предварительно сконструированные экземпляры или кешировать
экземпляры при их создании, чтобы избежать создания
ненужных дубликатов объектов. Метод Boolean. valueOf
(boolean) иллюстрирует этот метод: он никогда не создает
объект. Этот метод аналогичен проектному шаблону
Приспособленец (Flyweight) [12]. Он может значительно
улучшить производительность, если часто запрашиваются
эквивалентные объекты, особенно если их создание является
дорогостоящим. Возможность статических фабричных методов
возвращать один и тот же объект при повторных вызовах
позволяет классам строго контролировать, какие экземпляры
существуют в любой момент времени. Классы, которые работают
таким образом, называются классами с управлением
экземплярами (instance-controlled). Существует несколько
причин для написания таких классов. Управление экземплярами
позволяет классу гарантировать, что он является синглтоном
(раздел 2.3) или неинстанцируемым (раздел 2.4). Кроме того,
это позволяет неизменяемому классу значения (раздел 4.3)
гарантировать, что
27. 2.1. РАССМОТРИТЕ ПРИМЕНЕНИЕ СТАТИЧЕСКИХ ФАБРИЧНЫХ
МЕТОДОВ... 31 не существует двух одинаковых экземпляров: а .
equals (Ь) истинно тогда и только тогда, когда а==Ь. Это основа
проектного шаблона Приспособленец [12]. Такую гарантию
предоставляют типы перечислений (раздел 6.1). Третье
преимущество статических фабричных методов заключается в
том, что, в отличие от конструкторов, они могут возвращать
объект любого подтипа их возвращаемого типа. Это дает вам
большую гибкость в выборе класса возвращаемого объекта.
Одним из применений этой гибкости является то, что API может
возвращать объекты, не делая их классы открытыми. Сокрытие
классов реализации таким способом приводит к очень
компактному API. Эта техника ведет к каркасам на основе
интерфейсов (раздел 4.6), в которых интерфейсы
предоставляют естественные возвращаемые типы для
статических фабричных методов. До Java 8 интерфейсы не
могли иметь статических методов. По соглашению статические
фабричные методы для интерфейса с именем Туре размещались
в сопутствующем неинстанцируемом классе (раздел 2.4) с
именем Types. Например, Java Collections Framework содержит 45
реализаций интерфейсов, предоставляя немодифицируемые
коллекции, синхронизированные коллекции и т.п. Почти все эти
реализации экспортируются с помощью статических фабричных
методов в одном неинстанцируемом классе (java .util.
Collections). Все классы возвращаемых объектов являются
закрытыми. Collections Framework API гораздо меньше, чем
потребовалось бы в случае экспорта 45 отдельных открытых
классов, по одному для каждой реализации. Это не только
уменьшенный размер API, но и меньший концептуальный вес:
количество и сложность концепций, которые программисты
должны освоить для того, чтобы использовать API. Программист
знает, что возвращаемый объект имеет API, в точности
предусмотренный его интерфейсом, так что нет необходимости
читать дополнительную документацию для класса реализации.
Кроме того, использование такого статического фабричного
метода требует от клиента обращения к возвращаемому объекту
28. через интерфейс, а не через класс реализации, что в общем
случае является хорошей практикой (раздел 9.8). В Java 8 было
ликвидировано ограничение, что интерфейсы не могут
содержать статические методы, так что теперь мало причин для
предоставления не- инстанцируемого сопутствующего класса
для интерфейса. Многие открытые статические члены, которые
ранее располагались в таком классе, теперь размещаются в
самом интерфейсе. Обратите, однако, внимание, что по-
прежнему может оставаться необходимым поместить основную
часть кода реализации этих статических методов в отдельный
класс, закрытый на уровне пакета. Дело в том, что Java 8
требует, чтобы все статические члены интерфейса были
открытыми. Java 9 разрешает иметь закрытые статические
методы, но статические поля и статические классы-члены по-
прежнему обязаны быть открытыми.
32 ГЛАВА 2 СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ Четвертым
преимуществом статических фабричных методов является то,
что класс возвращенного объекта может варьироваться от
вызова к вызову в зависимости от входных параметров.
Допускается любой подтип объявленного типа возвращаемого
значения. Класс возвращенного объекта может также
изменяться от выпуска к выпуску. Класс EnumSet (раздел 6.3) не
имеет открытых конструкторов, а только статические фабрики. В
реализации OpenJDK они возвращают экземпляр одного из двух
подклассов в зависимости от размера базового типа
перечисления: если в нем не более 64 элементов (как в
большинстве перечислений), то статические фабрики
возвращают экземпляр RegularEnumSet, который реализуется
как один long; если же перечисление содержит больше 64
элементов, фабрики возвращают экземпляр JumboEnumSet с
массивом long. Существование этих двух реализаций классов
является невидимым для клиентов. Если RegularEnumSet
перестанет давать преимущества в производительности для
малых перечислений, он может быть устранен из будущих
версий без каких бы то ни было последствий. Аналогично в
29. будущую версию можно добавить третью или четвертую
реализацию EnumSet, если она окажется полезной для
производительности. Клиенты не знают и не должны
беспокоиться о классе объекта, который они получают от
фабрики; для них важно только, что это некоторый подкласс
EnumSet. Пятое преимущество статических фабрик заключается
в том, что класс возвращаемого объекта не обязан существовать
во время разработки класса, содержащего метод. Такие гибкие
статические фабричные методы образуют основу каркасов
провайдеров служб (service provider frameworks) наподобие Java
Database Connectivity API (JDBC). Каркас провайдера службы
представляет собой систему, в которой провайдер реализует
службу, а система делает реализацию доступной для клиентов,
отделяя клиентов от реализаций. Имеется три основных
компонента каркаса провайдера службы: интерфейс службы,
который представляет реализацию; API регистрации
провайдера, который провайдеры используют для регистрации
реализации; и API доступа к службе, который клиенты
используют для получения экземпляров службы. API доступа к
службе может позволить клиентам указать критерии выбора
реализации. В отсутствие таких критериев API возвращает
экземпляр реализации по умолчанию или позволяет клиенту
циклически обойти все имеющиеся реализации. API доступа к
службе представляет собой гибкую статическую фабрику,
которая лежит в основе каркаса провайдера службы.
Необязательный четвертый компонент каркаса провайдера
службы представляет собой интерфейс провайдера службы,
который описывает объект фабрики, производящий экземпляры
интерфейса службы. В отсутствие интерфейса провайдера
службы реализации должны инстанцироваться рефлективно
2.1. РАССМОТРИТЕ ПРИМЕНЕНИЕ СТАТИЧЕСКИХ ФАБРИЧНЫХ
МЕТОДОВ... 33 (раздел 9.9). В случае JDBC Connection играет
роль части интерфейса службы, DriverManager. registerDriver
представляет собой API регистрации провайдера, DriverManager.
getConnection — API доступа к службе, а Driver — интерфейс
30. провайдера службы. Имеется множество вариантов шаблонов
каркасов провайдеров служб. Например, API доступа к службе
может возвращать более богатый интерфейс службы клиентам,
чем представленной провайдерами. Это проектный шаблон Мост
(Bridge) [12]. Каркасы (фреймворки) внедрения зависимостей
(раздел 2.5) можно рассматривать как мощные провайдеры
служб. Начиная с Java 6 платформа включает каркас провайдера
служб общего назначения, java. util. ServiceLoader, так что вам
не нужно (а в общем случае и не стоит) писать собственный
каркас (раздел 9.3). JDBC не использует Service- Loader, так как
предшествует ему. Основное ограничение предоставления
только статических фабричных методов заключается в том, что
классы без открытых или защищенных конструкторов не могут
порождать подклассы. Например, невозможно создать подкласс
любого из классов реализации в Collections Framework. Пожалуй,
это может быть благом, потому что требует от программистов
использовать композицию вместо наследования (раздел 4.4), и
необходимо для неизменяемых типов (раздел 4.3). Вторым
недостатком статических фабричных методов является то, что
их трудно отличить от других статических методов. Они не
выделены в документации API так же, как конструкторы,
поэтому может быть трудно понять, как создать экземпляр
класса, предоставляемый статическим фабричным методом
вместо конструкторов. Инструментарий Javadoc, возможно,
когда-нибудь обратит внимание на статические фабричные
методы. Указанный недостаток может быть смягчен путем
привлечения внимания к статическим фабричным методам в
документации класса или интерфейса, а также путем
применения соглашений по именованию. Ниже приведены
некоторые распространенные имена для статических фабричных
методов, и этот список является далеко не исчерпывающим. •
from — метод преобразования типа, который получает один
параметр и возвращает соответствующий экземпляр требуемого
типа, например: Date d = Date.from(instant); • of — метод
агрегации, который получает несколько параметров и
возвращает соответствующий экземпляр требуемого типа,
31. объединяющий их, например: Set<Rank> faceCards =
EnumSet.of(JACK, QUEEN, KING);
34 ГЛАВА 2 СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ • valueOf —
более многословная альтернатива from и of, например:
Biginteger prime = Biginteger.valueOf(Integer.MAX_VALUE); •
instance или getlnstance — возвращает экземпляр, описываемый
параметрами (если таковые имеются), но о котором нельзя
сказать, что он имеет то же значение, например: StackWalker
luke = StackWalker.getlnstance(options); • create или newlnstance
— подобен instance или getlnstance, но отличается тем, что
гарантирует, что каждый вызов дает новый экземпляр,
например: Object newArray = Array.newlnstance(classObject,
arrayLen); • getType — подобен getlnstance, но используется,
если фабричный метод находится в другом классе. Туре
представляет собой тип объекта, возвращаемого фабричным
методом, например: Filestore fs = Files.getFileStore(path); • new
Type — подобен newlnstance, но используется, если фабричный
метод находится в другом классе. Туре представляет собой тип
объекта, возвращаемого фабричным методом, например:
BufferedReader br = Files.newBufferedReader(path); • type —
краткая альтернатива для get Type и new Type, например:
List<Complaint> litany = Collections.list(legacyLitany); Итак, могут
использоваться как статические фабричные методы, так и
открытые конструкторы, и следует уделить внимание
преимуществам одних перед другими. Часто статические
фабрики являются предпочтительнее, так что гасите свой
первый порыв предоставления открытого конструктора классу,
не рассмотрев вначале возможность использования статических
фабрик. 2.2. При большом количестве параметров конструктора
подумайте о проектном шаблоне Строитель Статические
фабрики и конструкторы имеют общее ограничение: они не
масштабируются для большого количества необязательных
параметров. Рассмотрим случай класса, представляющего
этикетку Nutrition Facts, которая имеется на упакованных
пищевых продуктах. Эти этикетки имеют несколько
32. обязательных полей — размер порции, число порций в упаковке,
калорийность порции, а также более двадцати необязательных
полей — количество жира,
2.2. ПРИ БОЛЬШОМ КОЛИЧЕСТВЕ ПАРАМЕТРОВ КОНСТРУКТОРА
ПОДУМАЙТЕ... 35 содержание насыщенных жиров, трансжиров,
холестерина, натрия и т.д. Большинство продуктов имеют
ненулевые значения только для нескольких из этих
необязательных полей. Какие конструкторы или статические
фабрики следует написать для такого класса? Традиционно
программисты используют шаблон телескопического
конструктора, когда предоставляется конструктор только с
необходимыми параметрами, другой — с одним необязательным
параметром, третий — с двумя необязательными параметрами и
так далее до конструктора со всеми необязательными
параметрами. Вот как это выглядит на практике (для краткости
показаны только четыре необязательных поля). final int final int
final int final int final int final int //(мл в порции) Необходим
//(количество порций)Необходим //(калорий в порции)
Необязателен //(жиров в порции) Необязателен //(Na в порции)
Необязателен servingSize; servings; calories; fat; sodium;
carbohydrate; //(углеводы в порции)Необязателен // Шаблон
телескопического конструктора - не масштабируется! public class
NutritionFacts { private private private private private private public
NutritionFacts(int servingSize, int servings) { this(servingSize,
servings, 0); } public NutritionFacts(int servingSize, int servings, int
calories) { this(servingSize, servings, calories, 0) ; } public
NutritionFacts(int servingSize, int servings, int calories, int fat)
this(servingSize, servings, calories, fat, 0) ; } public
NutritionFacts(int servingSize, int servings, int calories, int fat, int
sodium) ( this(servingSize, servings, calories, fat, sodium, 0) ; }
public NutritionFacts(int servingSize, int servings, int calories, int fat,
int sodium, int carbohydrate) { this.servingSize = servingSize;
this.servings = servings; this.calories = calories; this.fat = fat;
33. 36 ГЛАВА 2 СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ this.sodium
= sodium; this.carbohydrate = carbohydrate; } } Когда вы хотите
создать экземпляр этого класса, вы используете конструктор с
наиболее коротким списком параметров, который содержит все
параметры, которые вы хотите установить: NutritionFacts
cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27); Обычно
такой вызов конструктора требует множества параметров,
которые вы не хотите устанавливать, но вынуждены передавать
для них значения так или иначе. В данном случае мы передали
значение 0 для жиров. Когда есть “всего лишь” шесть
параметров, это может показаться не таким уж страшным, но по
мере увеличения количества параметров ситуация быстро
выходит из- под контроля. Короче говоря, шаблон
телескопического конструктора работает, но очень трудно
написать код клиента, у которого есть много параметров, и еще
труднее его читать. Читатель исходного текста должен гадать,
что означают все эти значения, и тщательно рассчитывать
позицию интересующего параметра. Длинные
последовательности одинаково типизированных параметров
могут вести к трудно обнаруживаемым ошибкам. Если клиент
случайно поменяет местами два таких параметра, компилятор не
будет жаловаться, но во время выполнения программа будет
вести себя неверно (раздел 8.3). Еще одной альтернативой при
наличии большого количества необязательных параметров в
конструкторе является шаблон JavaBeans, в котором для
создания объекта вызывается конструктор без параметров, а
затем вызываются методы для задания каждого обязательного
параметра и всех необязательных параметров, требуемых в
конкретной ситуации. // Шаблон JavaBeans - обеспечивает
изменяемость public class NutritionFacts ( // Параметры
инициализируются значениями // по умолчанию (если таковые
имеются) // Необходим; значения по умолчанию нет: private int
servingSize - -1; // Необходим; значения по умолчанию нет:
private int servings = -1; private int private int private int private int
calories = 0; fat = 0; sodium = 0; carbohydrate = 0; public
NutritionFacts () { }
34. 2.2. ПРИ БОЛЬШОМ КОЛИЧЕСТВЕ ПАРАМЕТРОВ КОНСТРУКТОРА
ПОДУМАЙТЕ... У] // Методы установки значений public void
setServingSize(int val) { servingSize = val; } public void
setServings(int val) { servings = val; } public void setCalories(int val)
( calories = val; } public void setFat(int val) ( fat = val; } public void
setSodium(int val) { sodium = val; } public void setCarbohydrate(int
val) { carbohydrate = val; } } У этого шаблона нет ни одного из
недостатков шаблона телескопического конструктора. Создание
экземпляров оказывается немного многословным, но легким и
для написания, и для чтения: NutritionFacts cocaCola = new
NutritionFacts(); cocaCola.setServingSize(240) ;
cocaCola.setServings(8); cocaCola.setCalories(100) ;
cocaCola.setSodium(35); cocaCola.setCarbohydrate(27) ; К
сожалению, шаблон JavaBeans имеет собственные серьезные
недостатки. Поскольку создание экземпляра распределено
между несколькими вызовами, JavaBean в процессе построения
может оказаться в частично несогласованном состоянии. Класс
не имеет возможности обеспечить согласованность просто путем
проверки корректности параметров конструктора. Попытка
использовать объект, находящийся в несогласованном
состоянии, может привести к ошибкам, которые находятся
далеко от кода, содержащего ошибку, а потому трудно
отлаживаются. Еще одним связанным недостатком является то,
что шаблон JavaBeans исключает возможность сделать класс
неизменяемым
38 ГЛАВА 2 СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ (раздел 4.3)
и требует дополнительных усилий со стороны программиста для
обеспечения безопасности с точки зрения потоков. Эти
недостатки можно уменьшить, вручную “замораживая” объект
после завершения его строительства и не позволяя
использовать его до тех пор, пока он не будет разморожен, —
но этот вариант громоздкий и редко используется на практике.
Кроме того, он может привести к ошибкам времени выполнения,
поскольку компилятор не может гарантировать, что программист
вызвал метод заморозки объекта перед его использованием. К
35. счастью, существует третий вариант, который сочетает в себе
безопасность шаблона телескопического конструктора и
удобочитаемость шаблона JavaBeans. Это разновидность
проектного шаблона Строитель (Builder) [12]. Вместо того чтобы
создавать объект непосредственно, клиент вызывает
конструктор (или статическую фабрику) со всеми необходимыми
параметрами и получает объект строителя. Затем клиент
вызывает методы установки полей объекта строителя для
задания каждого необязательного параметра, представляющего
интерес. Наконец, клиент вызывает метод build параметров для
создания объекта (обычно неизменяемого). Строитель обычно
представляет собой статический класс- член (раздел 4.10)
класса, который он строит. Вот как это выглядит на практике. //
Шаблон Builder public class NutritionFacts { private final int
servingSize; private final int servings; private final int calories;
private final int fat; private final int sodium; private final int
carbohydrate; public static class Builder { // Необходимые
параметры private final int servingSize; private final int servings; //
Необязательные параметры — инициализированы // значениями
по умолчанию private int calories = 0; private int fat = 0; private int
sodium = 0; private int carbohydrate = 0; public Builder(int
servingSize, int servings) { this.servingSize = servingSize;
this.servings = servings;
2.2. ПРИ БОЛЬШОМ КОЛИЧЕСТВЕ ПАРАМЕТРОВ КОНСТРУКТОРА
ПОДУМАЙТЕ... 39 public Builder calories (int val) { calories = val;
return this; } public Builder fat(int val) ( fat = val; return this; }
public Builder sodium(int val) { sodium = val; return this; } public
Builder carbohydrate(int val) { carbohydrate = val; return this; }
public NutritionFacts build() { return new NutritionFacts(this); } }
private NutritionFacts(Builder builder) { servingSize servings calories
fat sodium carbohydrate = builder.carbohydrate; =
builder.servingSize; = builder.servings; = builder.calories; =
builder.fat; = builder.sodium; Класс NutritionFacts неизменяемый, и
все значения параметров по умолчанию находятся в одном
месте. Методы установки полей строителя возвращают сам
36. строитель, так что эти вызовы можно объединять в цепочки,
получая потоковый (fluent) API. Вот как выглядит код клиента:
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
.calories(100).sodium(35).carbohydrate(27).build(); Такой
клиентский код легко писать, а главное — легко читать. Шаблон
Строитель имитирует именованные необязательные параметры,
как в языках программирования Python или Scala. Проверка
корректности параметров для краткости опущена. Чтобы как
можно скорее обнаруживать недопустимые параметры,
правильность параметров
40 ГЛАВА 2 СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ проверяется
в конструкторе и методах строителя. Проверка инвариантов
включает несколько параметров в конструкторе, вызываемом
методом build. Чтобы защитить эти инварианты, проверка полей
объекта выполняется после копирования параметров из
строителя (раздел 8.2). Если проверка не пройдена,
генерируется исключение IllegalArgumentException (раздел 10.4),
в котором подробно указывается, какие параметры оказались
недопустимыми (раздел 10.7). Шаблон Строитель хорошо
подходит для иерархий классов. Используйте параллельные
иерархии строителей, в которых каждый вложен в
соответствующий класс. Абстрактные классы имеют абстрактных
строителей; конкретные классы имеют конкретных строителей.
Например, рассмотрим абстрактный класс в корне иерархии,
представляющей различные виды пиццы: // Шаблон Строитель
для иерархий классов public abstract class Pizza { public enum
Topping { HAM, MUSHROOM, ONION, PEPPER, SAUSAGE } final
Set<Topping> toppings; abstract static class Builder<T extends
Builder<T>> ( EnumSet<Topping> toppings =
EnumSet.noneOf(Topping.class); public T addTopping(Topping
topping) ( toppings.add(Objects.requireNonNull(topping)) ; return
self(); } abstract Pizza build(); // Подклассы должны перекрывать
этот метод, возвращая "себя" protected abstract Т self(); }
Pizza(Builder<?> builder) I toppings = builder.toppings.clone(); //
См. раздел 8.2 } } Обратите внимание, что Pizza.Builder является
37. обобщенным типом с рекурсивным параметром типа (раздел
5.5). Это, наряду с абстрактным методом self, обеспечивает
корректную работу цепочек методов в подклассах без
необходимости приведения типов. Этот обходной путь для того
факта, что в Java нет “типа самого себя” (или “собственного
типа”), известен как идиома имитации собственного типа. Вот
два конкретных подкласса класса Pizza, один из которых
представляет стандартную Нью-Йоркскую пиццу, другой —
Кальцоне. Первый имеет
2.2. ПРИ БОЛЬШОМ КОЛИЧЕСТВЕ ПАРАМЕТРОВ КОНСТРУКТОРА
ПОДУМАЙТЕ... 41 необходимый параметр размера, а второй
позволяет указать, где должен находиться соус — внутри или
снаружи: public class NyPizza extends Pizza { public enum Size {
SMALL, MEDIUM, LARGE } private final Size size; public static class
Builder extends Pizza.Builder<Builder> { private final Size size;
public Builder(Size size) ( this.size = Objects.requireNonNull(size); }
^Override public NyPizza build() < return new NyPizza(this); }
^Override protected Builder self() { return this; } } private
NyPizza(Builder builder) ( super(builder); size = builder.size; } }
public class Calzone extends Pizza { private final boolean
sauceinside; public static class Builder extends
Pizza.Builder<Builder> { private boolean sauceinside = false; // По
умолчанию public Builder sauceinside() { sauceinside = true; return
this; } ^Override public Calzone build() { return new Calzone(this); }
(^Override protected Builder self() { return this;
42 ГЛАВА 2 СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ private
Calzone(Builder builder) ( super(builder); sauceinside =
builder.sauceinside; ) } Обратите внимание, что метод build в
строителе каждого подкласса объявляется как возвращающий
корректный подкласс: метод build класса NyPizza. Builder
возвращает NyPizza, в то время как в Calzone . Builder
возвращается Calzone. Эта методика, в которой метод подкласса
объявляется как возвращающий подтип возвращаемого типа,
объявленного в суперклассе, известна как ковариантное
38. типизирование возврата. Она позволяет клиентам использовать
эти строители без необходимости приведения типов. Клиентский
код этих “иерархических строителей”, по сути, идентичен коду
простого строителя NutritionFacts. В примере кода клиента,
показанном далее, для краткости предполагается статический
импорт констант перечисления: NyPizza pizza = new
NyPizza.Builder(SMALL)
.addTopping(SAUSAGE).addTopping(ONION).build(); Calzone calzone
= new Calzone.Builder() .addTopping(HAM).sauceinside().build();
Незначительное преимущество строителей над конструкторами
заключается в том, что строители могут иметь несколько
переменных (необязательных) параметров, поскольку каждый
параметр указан в собственном методе. Кроме того, строители
могут собирать параметры, передаваемые в нескольких вызовах
метода, в едином поле, как было показано в методе addTopping
выше. Проектный шаблон Строитель весьма гибкий. Один
строитель может использоваться многократно для создания
нескольких объектов. Параметры строителя могут
корректироваться между вызовами метода build для небольших
изменений создаваемых объектов. Строитель может
автоматически заполнять некоторые поля при создании объекта,
например серийный номер, который увеличивается каждый раз
при создании нового объекта. Конечно же, проектный шаблон
Строитель имеет и недостатки. Чтобы создать объект,
необходимо сначала создать его строитель. На практике обычно
стоимость создания строителя будет незаметной, но может
оказаться проблемой в смысле производительности в
критических ситуациях. Кроме того, шаблон Строитель является
более многословным, чем шаблон телескопического
конструктора, поэтому его следует использовать только при
наличии достаточно большого количества параметров, по
крайней мере не менее четырех. Но не забывайте, что в
будущем могут добавиться и другие параметры. Но если
2.3. ПОЛУЧАЙТЕ СИНГЛТОН С ПОМОЩЬЮ ЗАКРЫТОГО
КОНСТРУКТОРА... 43 вы начинаете с конструкторов или
40. future punishments, and Restorationists, or those who believe in a
punishment after death, but which is not eternal.
QUAKERS. Pennsylvania is the strong-hold of the Quakers, although
there are considerable numbers in New Jersey, the city of New
York, &c. There are two sects, the one orthodox, the other followers
of Elias Hicks, or Hicksites. They dispute between themselves which
has seceded from the original principles of the denomination. The
Quakers of England sent forth an epistle in 1829, containing a
confession of faith, which acknowledged the inspiration of the
Scriptures, the divinity of the Savior, his atonement, &c. The
Hicksites are generally considered the seceders.
The DUTCH REFORMED was the established church in New York until
its surrender to England. Its first classes was formed in America in
1757. Its government is vested in consistories, classes, and synods.
Members of the German Reformed church are found principally in
Pennsylvania, and also in Maryland, Virginia, Ohio, and other states.
There are more than five hundred congregations of them. The
American Lutheran church has eight hundred congregations. The
United Brethren, or Shakers, a singular, harmless, inoffensive and
industrious race, are found in Pennsylvania, North Carolina, New
York, Massachusetts, and other states. There may be about six
thousand of them. The Swedenborgians also hold an annual
convention.
INFIDELS. It is proper to mention under the head of religion, in
order to give a correct view of the religious state of the country, a
class of persons, divided into several subdivisions, and generally
looked upon with pity by professing Christians of all denominations,
and viewed with concern by all the rational friends of liberty. We
speak of the Owenites, Fanny Wrightites, Harmonites, Deists, or,
according to a very common form of parlance, Freethinkers, Infidels,
or Atheists. All of them, we believe, affirm that a community of
property, labor, and education, is necessary to the well-being of
mankind, and hold that a belief in divine revelation is unnecessary
41. and absurd. They hold, too, that the marriage covenant is binding
only during the pleasure of the contracting parties. Rapp, who
brought a colony of foreigners of this faith to the banks of the Ohio,
acquired an almost unlimited authority over them. He forbade the
intercourse of the sexes for a year or more, and was obeyed. He
divided the lands among his followers, instituted regulations for
manual labor, and the products of the common exertion was thrown
into a common stock. Mr. Owen’s settlement, called Harmony, was
conducted on nearly the same principles of equality. This gentleman
possessed a large property in Scotland, which he abandoned to
found a colony, and disseminate the doctrines of Voltaire and Paine,
in America, in which he was very efficiently aided by the celebrated
Miss Frances Wright. Both of them went about the country several
years, lecturing against Christianity and revelation; but with no very
great success. They finally showed that practice does not always
conform to principle, by marrying one another. Mr. Owen’s
settlement has long been abandoned, his followers not having
attained that degree of moral and social perfection requisite for its
success!
Such principles as those of Mr. Owen, striking, as they do, at the
very root of society, will never, it is to be hoped, prevail to any great
extent in any part of the world.88 The Freethinkers are at present
but a small body, without order or government as a party, and little
respectable as individuals. They are probably not more than five or
six thousand. They have newspapers and places of meeting, in New
York, Boston, and elsewhere. Many of them are avowed atheists.
Had they been persecuted, molested, or opposed in any degree, it is
probable they would have multiplied much faster than they have.
PAPISTS or Roman Catholics. This sect is rapidly increasing in the
United States; a fact which ought to alarm all the friends of liberty
and true religion.89
In 1632, a priest of the order of the Jesuits accompanied the
early settlers to Maryland, and since that time the Catholic
42. population have been supplied with instructers of their own
persuasion from England. A see was constituted, and a bishop
consecrated, in 1790. In 1810, it became an archiepiscopal see, and
four new suffragan dioceses were established, viz.: in Boston, New
York, Philadelphia, and Bardstown, in Kentucky, to which some more
have since been added, in New Orleans, Charleston, Richmond, and
Cincinnati, &c. Regular missions are also established all over the
country, and it would seem, from the zeal of the missionaries, as
well as by the language of the pope, that very great importance is
attached to the future religious faith of America by the court of
Rome. Nor have the devoted exertions of the priests failed of much
success, for it has been computed that half a million of the people of
the United States are Roman Catholics, of which not less than ten
thousand are in the city of Boston, being one sixth of its population.
It is stated that bishop England, of Baltimore, is an officer of the
Inquisition!
43. CHAPTER XIII.—
MANNERS AND
AMUSEMENTS.
THE dispositions and feelings of the inhabitants of the different
portions of the United States have been modified by a great variety
of circumstances. Difference of descent has operated with its usual
power. The stern Puritan, the open-hearted and honest Dutchman,
the light-hearted and easy Frenchman, the German, the Spaniard,
the Catholic, the Huguenot, all have their representatives in various
portions of the country. The distinctive national peculiarities have in
some measure been worn off, and the varying elements have been
amalgamated by constant intercourse, intermarriage, removals from
one part to another, and the gradual effects of time. Still the national
character is very distinct in distinct sections of the country, and in
the following account of the various manners and customs, we have
uniformly followed what we consider the best authority.
The people of New England are grave, though they are not
without humor; many of their amusements are of a reflecting kind,
and their conversation tends rather to useful than to light or gay
subjects. They are moral and pious, and the descendants of the
Puritans retain much of the strictness of their fathers. If not ardent,
44. they are to a great degree persevering, and though inquisitive, they
are equally communicative. They are shrewd and calculating, yet not
deceitful. They are no ‘granters of propositions;’ with them almost all
things are subjects for discussion, in which they manifest much
ingenuity. They have a caution that prevails in all things, and they
seldom answer directly an abrupt question, without knowing why it
is asked. They have the impress of Franklin; Poor Richard’s maxims
of thrift fall upon a congenial soil, and no proverbs are oftener
quoted, or more followed. They are like Franklin, to a great degree
inventive in practical things, and far the greater number of
inventions in the patent office are from New England. It is peculiar
to these people, that they are seldom found without a pocket knife,
which they use with dexterity; and boys at school are frequently
seen whittling, or cutting wood into some shape, for a wind-mill or
other toy. It is a universal trait, and it is said that a gentleman in
Havana, who invited a large company to dine, gave each man from
New England a shingle to cut, that they might not carve his
furniture.
One of the first traits developed in the New England character is,
if not a love of gain, at least a disposition to traffic. It commences at
an early age, and children at school not only exchange or ‘swap’
knives, and other things, but make lotteries, in which the prizes are
paid in gingerbread and raisins, and which leave a little profit to the
manager and proprietor. The farmers too, though not the most
industrious kind, sometimes bring up horses and cattle for a ‘swap’
to the village inn; and the tin pedlars, whose wheels are in every
road in the United States, are to a man from New England.
Another trait of character is the readiness with which the people
of New England admit the equality of all men with themselves, and
the steadiness with which they deny, both in theory and practice,
that any are superior. It would raise a tempest in the breast even of
a female domestic, to ask for her mistress, nor would she be
satisfied to be called a servant, or even a domestic. Help is the word
by which servants reconcile their pride with their interest or
45. employment, as it denotes, that though the assistants, they are the
equals of their employers. A foreigner probably finds some ground
for dissatisfaction on the score of domestics, for among house-wives
it is a subject of universal complaint at home; the best servants are
English, who have been more familiar with the distinction of classes.
The people of New England are distinguished for their
celebrations. They are interlocked with each other by innumerable
societies and associations, and one man is a member of many.
These have their anniversaries, which, with the national and other
holidays, make a great many processions, public dinners, and
addresses. It is also usual to offer public dinners to those who have
done acceptable services in high public stations.
A town meeting is perhaps the best place wherein to see the self-
control of the people, when highly excited on questions of general or
local interest. Every town is within certain limits a pure democracy,
and its doings are attended with perfect decorum under the
moderator, who is chosen, as the word implies, to mollify any over-
zealous excitement. If, on these occasions, any citizen becomes
turbulent, or abusive in language, the sense of the assembly is so
strongly expressed against him, that he is at once reduced to order.
Generally speaking, there are no mobs or riotous assemblies. The
interference of a few constables, or the reading of the ‘riot act’ by a
magistrate, is sufficient to disperse any tumultuous throng. A tumult
at a town meeting or election, is a thing unheard of among us.
Some of the most peculiar manners and customs of New England
are found in the island of Nantucket, and the neighboring part of the
continent. Nantucket is a happy settlement; not that it has precious
metals in its bosom, or fertility in its soil, but because the people are
simple, innocent, and contented. The sea is their patrimony, and
they gather its bounties in the most distant ports. The whale fishery
in New England was commenced by six persons in Nantucket; one
watched on an eminence for the spouting of the whale, and when he
discovered it, all would pursue in a small boat, and they seldom
46. failed to tow the leviathan ashore. Gains extended the adventure,
ships were fitted out, and the whale was chased from the temperate
regions to the arctic seas, and followed to the remotest shores of
the Pacific ocean.
Among the people, there are none idle, and few destitute. The
vices of commercial places are hardly known, and it is admitted all
over New England to be a great presumption in favor of a man’s
honesty, that he comes from Nantucket. The Friends or Quakers give
to the language a simplicity of diction truly Doric, and though they
take some liberties with the commonwealth’s English, yet in a person
brought up with them, to speak in a more classic manner would be
held to savor of affectation and pretension. The various
relationships, and the kindly feelings, have introduced the custom of
calling elderly people uncle or aunt, and the younger, cousin. Even a
stranger soon falls into this habit. The people generally marry young,
and few live in celibacy. They are social to a great degree, and are
eminently distinguished for their frequent visitings, to sup at each
other’s houses. They live more as though they made a large family,
than a small community.
The following tribute to the New England character is from
Captain Hall, whom no one can accuse of a desire to overpraise
what he saw in this country. ‘I had, however, many sharp amicable
discussions with my friends at Boston, on the thousand and one
topics that arose between us, but I must do them the justice to say,
that I never met a more good-natured, or perhaps I should say,
good-tempered people; for, during the whole course of my journey,
though I never disguised my sentiments, even when opposed to the
avowed favorite opinions of the company, I never yet saw an
American out of temper. I fear I cannot say half so much for myself,
for I was often a good deal harassed by these national discussions,
when the company and I took our station on the opposite poles of
the question. But it is pleasant to have it in my power to say that
I cannot recall a single instance in which any thing captious, or
personally uncivil, was ever said to me, though I repeated openly,
47. and in all companies, every thing I have written in these volumes,
and a great deal more than upon cool reflection I choose to say
again.’
In general, the amusements are of a thoughtful rather than a gay
character, and games of skill are preferred to those of chance. The
character of the Puritans has given some tone to the amusements
and holidays. Theatres are seldom even fashionably attended, and
there are many who hold it unlawful to enter them. There are
places, too, in the country, where dancing is considered to be a
‘vain, idle, and sinful amusement.’
The active sports are principally games of ball, and sometimes
running and wrestling; formerly, different towns and parishes had
their champions in wrestling, to try their superiority by matches, in
which several fatal accidents occurred; but the sport is now almost
entirely disused. Boxing, which is so universal in England, is almost
unknown, and horse-racing and cock-fighting are seldom seen. In
winter, when there are delightful moonlight nights, sleigh-rides are a
favorite amusement. Parties of both sexes sit in large sleighs, as
closely as they can be packed, and sometimes in each others’ laps,
scour over several miles at a rapid rate, and at some hotel, find not
only a supper but a fiddler in attendance, whose gains are much
enhanced in the season of sleighing. There are several holidays, but
none that are observed in England. Election day is that on which the
governor is declared to be elected, and has heretofore been one of
the most ‘time-honored’ days in the calendar. On this day, the young
men often take sides, in what is called a ‘bird shoot,’ to destroy the
birds most mischievous to crops, and the party bringing in the least
number of heads is vanquished, and gives a dinner to the other.
Fast day is an observance that has descended from the pilgrims,
and is kept with a decent solemnity. The governors appoint one day
in the year, in all the New England states, for ‘fasting, humiliation,
and prayer;’ there is little business transacted, and the people
generally attend in the churches, which are called more generally,
48. from an old dislike to Episcopacy, meeting-houses. Thanksgiving is
also a day appointed by the same authorities, and the intent of the
edict or proclamation is carried into full effect by the disposition of
the people. It is always appointed in the fall or autumn, after the
harvests, when the garners are full; and poor indeed is the inmate of
the hovel that has not on that day plenty and luxury on his board.
The preparations for thanksgiving continue several days, and for
many more the prepared viands are not exhausted. It is the day for
family meetings, and it is then that members of the same family
often come hundreds of miles to meet again, to renew the bands of
affinity and affection under the paternal roof. It is at this feast that
the simplicity and patriarchal character of a New England grandsire
is pre-eminent.
Before and after thanksgiving, there are held all over the country
‘shooting matches,’ which are announced by printed placards,
headed ‘sportsmen attend,’ and which set forth that geese, turkeys,
and fowls, will be set up for marksmen. They are shot at, generally
after they are killed, with rifles, at certain distances, and rates are
paid for every shot. If they are hit, the marksman has the game.
These sports are commonly held in some retired spot, or at some
deserted house, by which there is little passing, and where a day or
two is spent as in an encampment. A bear or deer is sometimes shot
at in the same way.
Autumn also brings other holiday observances, one of which is
‘husking,’ when the men of a neighborhood meet to husk the Indian
corn of one of the number, that is, to separate it from the sheaf.
A good supper, and sometimes a dance, ensues. The females have
also similar meetings, called ‘quilting bees,’ when many assemble to
work for one, in padding or quilting bed coverings or comforters.
Militia musters or reviews collect many people, but they are happily
growing out of date; they generally display the most repulsive traits
of the New England character. An ordination of a clergyman over a
society discloses better characteristics. It is a time when every house
in the society is invitingly open, when the master generally ‘provides’
49. for more guests than he has the good fortune to secure; and when
he may be seen forestalling his neighbors, by asking visiters to dine,
before they arrive at the church. Persons of all creeds and conditions
are pressed, nothing loath, to the feasts that smoke upon a hundred
tables.
Ploughing matches and cattle shows are held only in autumn;
they attract many people, and give a favorable impulse to the
interests of agriculture. The celebration of the fourth of July, or, as it
is called, Independence, is not peculiar to New England; it is the
great national holiday, honored by salutes of cannon, fireworks,
processions, addresses, dinners, in all cities, and in the most
secluded corners of the republic.
In the middle states there is little general or peculiar character. In
Pennsylvania, society takes a tone from the Friends, particularly in
Philadelphia and some other towns; in the interior, German influence
is equally perceptible. New York has the air and character of all great
commercial cities. One abominable custom deserves to be
mentioned with reprobation. Swine are by law permitted to range at
large, and these quadruped scavengers are, of course, intolerable
nuisances. Philadelphia and Baltimore seem to have escaped, in
some measure, from the moral evils which appear almost
inseparable from great cities. In these places, the manner of life is
far more quiet and domestic than in New York, and in the former city
the arts and sciences meet with a more assiduous cultivation. The
Wistar parties of this city, assemblies held at gentlemen’s houses,
where the conversation is chiefly on literary and scientific subjects,
are much praised by intelligent strangers.90
The amusements of the middle states are more various than the
other sections of the country. As the three largest cities in the union
are distant one from the other but about a hundred miles, there are
of course greater facilities and encouragement for scenic exhibitions;
and the theatres, especially in New York, are much attended. The
actors are generally English, and the best English performers often
50. come over for a season. There is a French opera company, also, who
at times perform in the cities, where they give general pleasure, and
a splendid opera house has been recently erected in New York. In
the latter city, there are several expensive public gardens, in which a
great variety of costly fireworks, shows, and amusements, are
offered in the warm seasons; when lighted up at night, they are very
brilliant, and they attract crowds of people. There are many small
gardens, where refreshments are sold; and in Philadelphia the
number of these is considerable, though some of them contain little
else than a few alcoves, covered with creeping plants.
Horse racing, which in New England is almost unknown, is more
honored in the middle states; and some of the matches on Long
Island and in Dutchess county, have been attended by vast crowds
of people. Boat races also are sometimes held in the calm waters
about New York.
Skating is practised with great animation, and thousands of
people collect on the Delaware, at Philadelphia, when the stream is
frozen. An ox, on such occasions, has sometimes been roasted on
the ice, near the Mariners’ hotel, which is the hull of a large vessel,
moored in the river. Skating is very general amusement in the
northern parts of the United States, and there are few boys who
have not a pair of skates. Coasting is another winter pastime, in
which, as in many other games, the labor seems to be at least equal
to the pleasure. When the snow covers the earth, a troop of joyous
boys assemble on the top of a long and steep hill, and each one
sitting upon a little sled, gives it an impulse which carries him to the
bottom with accelerating velocity, and far into the plain below. The
motion is sometimes so swift that it is like the sweep of an eagle. In
the cities, fatal accidents occur in following this amusement, and
there are generally penalties imposed by law for pursuing it there.
The coasting is performed, however, in the country, upon a
grander scale; the great ox sled, or sledge, is carried up with
commendable perseverance and toil, and so covered with youth of
51. both sexes, that little of the timber appears. When fitted, it is
launched; but when adrift it is more difficult to be guided than the
single sledge, and the whole freight is sometimes turned topsy turvy
into a snow bank half way down the hill. This, however, seems to
increase the enjoyment. This practice of coasting is even more
common in New England than in the middle states.
There are some traits of character which run through the
southern states, modified by a variety of circumstances, but most
obviously and generally by the system of domestic slavery. The
character of Virginia and South Carolina is perhaps, in many
respects, superior to that of the Southern states, yet the principal
characteristics are common to all. In Virginia, many of the old
English modes of life are retained, and the domains of the landed
proprietors have the extent of English baronies. Attachment to
home, family connections, and profuse hospitality, eminently
distinguish this high-minded and honorable class.
The people of Carolina, who dwell in the lower country, are
annually compelled to leave their homes, however attached to them.
None can travel without gaining knowledge, and losing prejudices,
and the Carolinians are, to a great degree, liberal and intelligent. To
remain in summer on the plantations, is at the risk of life; they are
therefore found, at that season, in the northern and eastern states,
and in Europe. They are social, and in general closely united. In New
England, gentlemen of neighboring towns are often unacquainted
with each other; but in Carolina, the acquaintance extends over the
state. This arises from the intercourse of the capital, where all are
found in spring, and from the fellowships that are formed in packets,
or while residing or travelling in other states.
It may be thought that the life of a southern agriculturist is one
of indolence and ease. It is the very reverse; it is one of far greater
activity than is led by gentlemen of wealth elsewhere. The cares of a
plantation are sufficient to consume the day, and the planter is often
on horseback in his fields, till evening. His notions of space are so
52. liberal, that he will readily ride a dozen miles to dine, and he
engages in the chase with his characteristic ardor. No men ride so
fearlessly; and the game is followed at full speed in thick woods,
among holes, horizontal branches, and prostrate trunks. The social
relations are admirable. The season for visiting is never over, and as
the social is as much increased as any other principle, by cultivation,
here it attains to its best growth. There is, among relatives, great
kindliness of feeling, and the circle it embraces is wider than in New
England. Any one may, as far as affinity can be traced,
‘Claim kindred there, and have his claim allowed.’
Gentlemen meet at frequent intervals in club houses, often built in
the woods, where the entertainment is furnished by each one in
turn.
The people of the south have more haughtiness, courtesy, and a
higher estimation of personal dignity, than those of the north. Pride
is the natural consequence of superiority of station, though it is
generally incompatible with meanness. A planter would be more apt
to do what he would be sorry for, than what he would be ashamed
of. A slight wound of pride is more strictly avenged, than a greater
injury to property; and a lack of courtesy is perhaps as much
reprobated as a breach in morals. Duelling is the natural growth of
such a state, and though it is not frequent, it is but too well
established by custom. The challenged is held to fight, even if he
feel no resentment, or has done no injustice; and he sometimes
perils his life for mere expediency: as he would put it to some risk to
preserve his property, he is led to believe that he must do it also to
save his character.
‘The poles,’ says a recent traveller, ‘are not more diametrically
opposed, than a native of the states south of the Potomac, and a
New Englander. They differ in every thing of thought, feeling, and
opinion. The latter is a man of regular and decorous habits, shrewd,
53. intelligent, and persevering; phlegmatic in temperament, devoted to
the pursuits of gain, and envious of those who are more successful
than himself. The former—I speak of the opulent and educated—is
distinguished by a high-mindedness, generosity, and hospitality, by
no means predicable of his more eastern neighbors. He values
money only for the enjoyments it can procure, is fond of gayety,
given to social pleasures, somewhat touchy and choleric, and as
eager to avenge an insult as to show a kindness. To fight a duel in
the New England states would, under almost any circumstances, be
disgraceful. To refuse a challenge, to tolerate even an insinuation
derogatory from personal honor, would be considered equally so in
the South.
‘In point of manner, the southern gentlemen are decidedly
superior to all others of the union. Being more dependent on social
intercourse, they are at greater pains, perhaps, to render it
agreeable. There is more spirit and vivacity about them, and far less
of that prudent caution, which, however advantageous on the
exchange, is by no means prepossessing at the dinner-table, or in
the drawing-room. When at Washington, I was a good deal thrown
into the society of members from the South, and left it armed, by
their kindness, with a multitude of letters, of which I regret that my
hurried progress did not permit me to avail myself. Many of them
were men of much accomplishment, and I think it probable that
Englishmen, unconnected with business, would generally prefer the
society of gentlemen of this portion of the union, to any other which
the country affords.’
The amusements and occupations of the people inhabiting the
valley of the Mississippi afford no great scope to the pen of the true
chronicler, though they have often furnished materials for the foreign
traveller and the novelist. A new country, inhabited by what may be
called, in some sort, a new people, must, however, present some
scenes which may serve to amuse, if not to instruct.91
54. New Orleans seems, by common consent, to be the focus in
which the eccentricities of Missouri, Kentucky, and the rest of the
western country concentrate. Here are seen the Spaniard with his
lazo, the Kentuckian with his broad-horn, or flat-bottomed ark, the
merchant from Europe or the New England states, stepping stately
from the deck of his ship, the slave with his burthen on his
shoulders, and the gambler looking out for his prey. Not the least
interesting of the classes of this heterogenous population, are the
women who have not the pure white complexion of the Atlantic
coast, or the crisp locks and bent limbs of their remote African
ancestors. These females hold an anomalous position among the
races by whom they are surrounded, which will require some further
comment. They are called quadroons, mustees, mulattoes, &c. as
the purity of their parentage or the circumstances of their birth may
require.
These women, being generally the offspring of white men of
standing and respectability, are left in singularly unfortunate
circumstances. They have the feelings, and, in a considerable
degree, the education and sentiments of their more pure-blooded
countrywomen. Nevertheless, the prejudice, or feeling, be it natural
or not, which inclines every free white American to view the whole
African race as an inferior order of mankind, prevents any legitimate
union with them. So situated, they make the best of the condition
into which the accident of birth, and not their own fault, has thrown
them. They form temporary connections with such respectable
whites as are able to maintain them in ease, and attachments are
often formed, which are not surpassed, or scarcely equalled, by any
of which we read in romance. However, the connection is generally
considered in the light of a bargain. The mother promenades with
her fairer daughter on the levee, till some white stranger, smitten
with the charms of the latter, makes a proposal. A bargain is made,
limited in time, or unlimited, according to circumstances, and a
breach of faith, thus plighted, rarely occurs. This connection,
infamous as it seems, involves no disgrace in New Orleans. It is the
most respectable condition to which a female, who is conscious of
55. the taint of black blood, can aspire. She is neither shunned nor
scorned, and may hold up her head in any company into which she
may happen to enter.
Strange scenes sometimes occur, in consequence of the mixture
of races on the banks of the levee of New Orleans. The small trader
tries to take advantage of all with whom he is thrown in contact. The
Indian begs, the over-wrought slave groans, the backwoodsman
bullies. ‘Twenty dollars,’ cried a Kentuckian boatman, stepping upon
the levee, ‘to any man who stops my moderate head-way.’ A Mexican
hunter of wild horses, who rode quietly behind him, threw his lazo
over his head, wheeled his horse short round, and gallopped up the
levee, dragging the boaster after him.
Gaming is practised in New Orleans, probably to a greater extent
than in any other part of the United States. The vice being
considered little or no shame, houses are kept openly. This may be
considered one great well-spring of social corruption.
The inhabitants of the states on the Ohio and Mississippi raise
great quantities of grain, not to speak of pork and other
commodities which bring profit to American agriculturists. New
Orleans is the mart where these articles find a vent, and the
principal object of a western farmer is to get them thither. To this
effect, he builds what he calls a flat boat, that is to say, a large
square box, without a lid, capable of containing and transporting
many tons. The materials of this vehicle are found in abundance all
over the valley of the Mississippi, and the cost of building it is
therefore small. In this bark the farmer commits himself to the
waters, and if he escapes snags, sawyers, &c. which usually
happens, he arrives in New Orleans, where he disposes of his
produce. Keel boats are also used for the transportation of goods
and produce, but since steamboats have become common on the
Mississippi waters, they have in a great measure superseded the
aforesaid means of conveyance. Still, the keel and flat boats may
merit a description. The former were nearly in the form of the
56. packets used on the Erie and Middlesex canals, and were propelled
by poles, oars, and sails. The latter were unmanagable hulks, which
floated at the mercy of the current, and could only be diverted from
rocks, snags, and other perils of river navigation, by the use of
sweeps, which, however, could only move them in a lateral direction.
On arriving at New Orleans, their owners broke them up, as no
human power could have taken them up stream, and sold them for
fire wood. They then returned to their homes by land. Flat and keel
boats are now rarely seen on the western waters; but when they
were the only means of transportation, they reared a hardy class, fit
to fight with Indians, or to subdue the wilderness. This class, thanks
to steam navigation, is now on the verge of extinction, and the
valley of the Mississippi has seen ‘the Last of the Boatmen.’
‘King balls’ are still in vogue in this region, both in the white and
free colored classes. A ball is given, precisely like those known in
other parts of the United States, excepting in one particular. He who
gives the ball, singles out a lady whom he designates his ‘queen,’ to
whom he gives, and who receives, his exclusive attention, for the
remainder of the season. The other guests do likewise, and the
queens frequently receive presents to a large amount, before the
temporary connection is dissolved. Evil is seldom, if ever, known to
come of this custom.
Rough athletic sports, racing and shooting matches, are the most
common amusements of the men of the west. It is common for
parties to test their marksmanship by squirrel shooting, with the
western weapon, the rifle. The hunter aims solely at the head of the
little animal, and the shot which takes effect in any other part is
reckoned as nothing. The rifle used in this and other sports, is very
different from those used by volunteer companies in the eastern
states, the barrel being very heavy, the bore small, and the sights
adjusted with scrupulous accuracy. Hence the proverbial
marksmanship of the backwoodsmen, so apparent at New Orleans
and elsewhere. The feats of individual hunters almost transcend
belief. Some have been known to throw two apples into the air, and
57. strike them both with a single bullet as they crossed each other, and
it is not uncommon for one man to hold up a small object for
another to shoot at. The celebrated ‘Mike Fink’ used to amuse
himself by shooting off the tails of swine, as they ran, and hitting his
wife’s comb upon her head.
A pastime is sometimes practised at weddings and other high
festive occasions, which is called a goose or gander pulling. The
manner is this. The toughest goose is selected from the flock, and
its neck is stripped of its feathers, and then well soaped or greased.
A suitable tree is next selected, an oak or hickory being preferred.
The feet of the fowl are then made fast to the extremity of a pliant
limb, about as high as a man on horseback can reach. Bets are
made, and a prize proposed. The first sportsman rides under the
tree at full speed, and snatches at the neck of the devoted fowl as
he passes. If he succeeds in pulling off its head, he gains the prize;
but this rarely happens at the first trial. The neck is too slippery, the
animal sees and avoids the horseman’s grasp, and the swaying
branch aids its efforts. Besides, the exploit requires no little strength
of arm, and is seldom accomplished without sundry falls and bruises;
all of which are considered matter of merriment.
The slaves of that section have little amusement, save what they
derive from their constitutional good humor. Dances and corn
huskings, or shuckings, are their chief pastimes. After laboring hard
all day, the negro will cheerfully run to a dance, half a score of miles
off, and get back to his toil before morning. A corn shucking is a
matter of more importance. The sable helots sit in a circle round the
heap of maize, keeping time with head and hand to some rude ditty
like the following:—
58. ‘O I wish that I had the wings of an eagle!
Ho! ho! he—ho—ho!
I’d fly away to a wild-goose country,
Ho, ho, he—ho—ho!’
This is sometimes accompanied by the banjoe, a kind of rude fiddle.
‘Possum up a gum stump,’ is a great favorite with these choristers.
Buffalo hunting was once, as deer hunting is now, a favorite
amusement of the backwoodsmen. The wild cattle have long since
receded beyond the Mississippi, and now furnish sport only to the
wandering Indians, their traders, and the no less hardy bands of
trappers and hunters. Some account of the manner of taking this
huge animal may not be out of place here.
The scent of the buffalo, though otherwise it is a very stupid
animal, is exceedingly acute. It will scent a man more than a league,
and flee in alarm, though it is not terrified at the sight of the human
race. Hence it is necessary for the pedestrian hunter to get to
leeward of the object of his pursuit. Having approached the animal
as nearly as he well may, he stoops, then gets upon all fours, and
finally drags himself along prone, pushing his firelock before him. If
there be long grass, or if, in winter, the snow be deep, the
circumstance much facilitates his operations. If the animal ceases to
feed to look at him, he stops and remains motionless till it begins to
graze again. By observing these precautions, the buffalo may be
approached to within a few yards. When the hunter is nigh enough,
he directs his aim behind the beast’s fore-shoulder, and inflicts a
mortal wound. This, however, is but a slow and unsatisfactory mode
of hunting, inasmuch as it consumes much time, and only one
buffalo can be killed in many hours. The best and most experienced
hunters follow the chase on horseback.
59. The mounted sportsman dashes into the thick of the herd, and
singles out the best and fattest. The buffalo, when frightened, runs
fast, but awkwardly. His gait is that of a swine, and this peculiar gait
the trained horse acquires, and assumes when beside the game,
obeying the least pressure of the rider’s foot or knee. The hunter
takes care to keep at least his horse’s length from the buffalo, in
order that, if the latter should turn upon him, which he will certainly
do if wounded, he may have time and space to escape. All
precautions being duly taken, the horseman throws the reins on his
steed’s neck, holds his gun stiffly with both hands, and fires. The
horse swerves at the flash, and the rider directs him to new game,
himself loading at full speed. An expert huntsman will kill as many as
half a score of buffaloes at one race, and rarely misses the heart.
When an Indian wounds a buffalo, he leaves it to die or separate
from the herd, and his companions never interfere with what has
thus become his property. Few of the skins of the animals so killed
are taken, and the greater part of the flesh remains a prey to the
wolves and ravens. When the cattle are in plenty, they are slain
merely for their tongues, humps, and other delicate morsels. Vast
havoc is made of them every year.
The more remote Indians, not being provided with fire arms, use
bows and arrows in the chase, and with great effect. A single arrow
is often known to go through and through a buffalo, and it is seldom
a shaft stops short of the feather. But whether it strike deep or not,
if it does but stick, the animal’s fate is sealed. It works inward as he
runs, and eventually reaches the vitals.
It is a cheering sight to see an Indian buffalo hunt. The tread of
the herd shakes the solid earth; the hunters animate each other with
loud shouts, and the guns flash incessantly. Here a rider is seen
fleeing for life before some infuriated animal; there a buffalo stands
at bay. Altogether, the scene produces an excitement which those
only who have felt can conceive. The passion for this chase
60. increases with time, and few professed buffalo hunters leave it
before age disables them.
There are many apparent dangers in buffalo hunting. The prairies
are full of holes dug by badgers and other burrowing animals, in
which the horse may stumble, and there is some risk from the horns
of the chase. Nevertheless, it is seldom that any serious accident
occurs.
Another mode of taking the buffalo was formerly in use among
the Indians of the Mississippi. Two rows of stakes were planted in
the prairie, gradually converging, till at their extremity they barely
left a passage into an inclosure of a few yards in area. These rows
were a league or more in length, and on the top of each stake was
placed a piece of turf, which frightened the cattle, and prevented
them from attempting to escape in a lateral direction. The herd,
being pursued by horsemen to the entrance of this artificial defile,
were driven onward till they reached the pound, when the entrance
was closed, and the work of destruction began. Few ever escaped,
for the buffalo has little sagacity, and, being thus shut up, will run
round and round, without attempting to break through the barriers
which inclose them. This mode of hunting is still practised by some
of the more remote tribes.92
Deer are hunted on the Mississippi, both by whites and Indians,
in a way unknown in the eastern states. In the hot nights of
summer, the deer resort to streams and ponds, to escape from the
myriads of mosquitoes with which the woods teem, and stand
immersed in the water for hours. Sportsmen take advantage of this
habit to destroy them. A board is placed in the front of a canoe,
before which burns a torch. The board serves to deflect the light
from the person of the hunter, who paddles as silently as possible
along the margin. The devoted deer seems to be fascinated by the
glare of the torch, and suffers the canoe to approach within five
yards of him. Nay, even the sound of a gun close at hand will scarce
61. startle him. Two or three are often killed within a stone’s throw of
each other.
We are not aware that, besides the particulars already noticed
under this head, there are any occupations or amusements peculiar
to the people of the west, of sufficient importance to require
description.