Глава 1. Введение 1
Глава 2. Создание и уничтожение объектов 6
1 Рассмотрите возможность замены конструкторов статическими методами генерации 6
2 Используйте шаблон Builder, когда приходится иметь дело с большим количеством параметров конструктора 5
3 Свойство синглтон обеспечивайте закрытым конструктором или типом перечислений 24
4 Отсутствие экземпляров обеспечивает закрытый конструктор 27
5 Избегайте ненужных объектов 28
6 Уничтожайте устаревшие ссылки (на объекты) 34
7 Остерегайтесь методов finalize 38
Глава 3. Методы, общие для всех объектов 46
8 Переопределяя метод equals, соблюдайте общие соглашения 46
9 Переопределяя метод equals, всегда переопределяйте hashCode 62
10 Всегда переопределяйте метод toString 71
11 Соблюдайте осторожность при переопределении метода clone 74
12 Подумайте над реализацией интерфейса Comparable 86
Глава 4. Классы и интерфейсы 94
13 Сводите к минимуму доступность классов и членов 94
14 В открытых классах используйте методы доступа, а не открытые поля 100
15 Предпочитайте постоянство 102
16 Предпочитайте компоновку наследованию 114
17 Проектируйте и документируйте наследование либо запрещайте его 122
18 Предпочитайте интерфейсы абстрактным классам 130
19 Используйте интерфейсы только для определения типов 138
20 Объединение заменяйте иерархией классов 140
21 Используйте объект функции для выполнения сравнения 144
22 Предпочитайте статические классы-члены нестатическим 148
Глава 5. Средства обобщенного программирования (Generics) 154
23 Не используйте необработанные типы в новом коде 155
24 Избегайте предупреждений о непроверенном коде 163
25 Предпочитайте списки массивам 166
26 Поддерживайте обобщенные типы 173
27 Поддерживайте обобщенные методы 179
28 Используйте ограниченные групповые символы для увеличения гибкости API 186
29 Использование неоднородных контейнеров 195
Глава 6. Перечислимые типы и аннотации 203
30 Используйте перечислимые типы вместо констант int 203
31 Используйте поля экземпляра вместо числовых значений 218
32 Используйте EnumSet вместо битовых полей 219
33 Используйте EnumMap вместо порядкового индексирования 221
34 Имитируйте расширяемые перечислимые типы с помощью интерфейсов 227
35 Предпочитайте аннотации шаблонам присвоения имен 232
36 Используйте аннотацию Override последовательно 241
37 Используйте маркерные интерфейсы для определения типов 244
Глава 7. Методы 248
38 Проверяйте достоверность параметров 248
39 При необходимости создавайте резервные копии 252
40 Тщательно проектируйте сигнатуру метода 258
41 Перезагружая методы, соблюдайте осторожность 261
42 Используйте varargs с осторожностью 269
43 Возвращайте массив нулевой длины, а не null 274
44 Для всех открытых элементов API пишите doc-комментарии 277
Глава 8. Общие вопросы программирования 286
45 Сводите к минимуму область видимости локальных переменных 286
46 Предпочитайте использование цикла for-each 290
47 Изучите библиотеки и пользуйтесь ими 294
48 Если требуются точные ответы, избегайте использования типов float и double 298
49 Отдавайте предпочтение использованию обычных примитивных типов, а не упакованных примитивных типов 301
49 Не используйте строку там, где более уместен иной тип 306
50 При конкатенации строк опасайтесь потери производительности 310
51 Для ссылки на объект используйте его интерфейс 311
52 Предпочитайте интерфейс отражению класса 314
53 Соблюдайте осторожность при использовании машинозависимых методов 319
54 Соблюдайте осторожность при оптимизации 321
55 При выборе имен придерживайтесь общепринятых соглашений 325
Глава 9. Исключения 331
56 Используйте исключения лишь в исключительных ситуациях 331
57 Применяйте обрабатываемые исключениядля восстановления, для программных ошибок используйте исключения времени выполнения 335
58 Избегайте ненужных обрабатываемых исключений 338
59 Предпочитайте стандартные исключения 341
60 Инициируйте исключения, соответствующие абстракции 344
61 Для каждого метода документируйте все инициируемые исключения 347
62 В описание исключения добавляйте информацию о сбое 350
63 Добивайтесь атомарности методов по отношению к сбоям 353
64 Не игнорируйте исключений 356
Глава 10. Потоки 358
65 Синхронизируйте доступ потоков к совместно используемым изменяемым данным 358
66 Избегайте избыточной синхронизации 365
67 Предпочитайте использование экзекуторов и заданий вместо потоков 373
68 Предпочитайте использовать утилиты параллельности, нежели wait и notify 376
69 При работе с потоками документируйте уровень безопасности 383
70 С осторожностью используйте отложенную инициализаию 388
71 Не попадайте в зависимость от планировщика потоков 393
72 Избегайте группировки потоков 396
Глава 11. Сериализация 399
73 Соблюдайте осторожность при реализации интерфейса Serializable 399
74 Рассмотрите возможность использования специализированной сериализованной формы 407
75 Метод readObject должен создаваться с защитой 416
76 Для контроля над экземплярами предпочитайте использование перечислимых типов методу readResolve 424
77 Рассмотрите использование агентов сериализации вместо сериализованных экземпляров 430
Список литературы 435
Добавить комментарий