- •Содержание
- •1. Введение
- •2. Создание и уничтожение объектов
- •3. Методы, общие для всех объектов
- •4. Классы и интерфейсы
- •5. Замена конструкций на языке c
- •6. Методы
- •7. Общие вопросы программирования
- •8. Исключения
- •9. Потоки
- •10. Сериализация
- •11. Литература
- •Глава 1
- •Глава 2 Создание и уничтожение объектов
- •Рассмотрите возможность замены конструкторов статическими методами генерации.
- •Свойство синглтона обеспечивайте закрытым конструктором
- •Отсутствие экземпляров обеспечивает закрытый конструктор
- •Не создавайте дублирующих объектов
- •Уничтожайте устаревшие ссыпки (на объекты)
- •Остерегайтесь методов flnalize
- •Глава 3 Методы, общие для всех объектов
- •Переопределяя метод equals, соблюдайте общие соглашения
- •Переопределяя метод equals, всегда переопределяйте hashCode
- •Всегда переопределяйте метод toStrlng
- •Подумайте над реализацией интерфейса ComparabIe
- •Глава 4 Классы и интерфейсы
- •Сводите к минимуму доступность классов и членов
- •Предпочитайте постоянство
- •Предпочитайте компоновку наследованию
- •Предпочитайте интерфейсы абстрактным классам.
- •Используйте интерфейсы только для определения типов
- •Предпочитайте статические классы-члены нестатическим
- •Глава 5
- •3Амена констрvкций на языке с
- •3Аменяйте структуру классом
- •3Амеияйте объедииеиие иерархией классов
- •/* Помещает данные в одно из полей объединения ... */
- •3Аменяйте конструкцию enum классом
- •Указатель на функцию заменяйте кпассом и интерфейсом
- •Глава 6 Методы
- •Проверяйте достоверность параметров
- •При необходимости создавайте резервные копии
- •Тщательно проектируйте сигнатуру метода
- •Перегружая методы, соблюдайте осторожность
- •Возвращайте массив нулевой длины, а не null
- •Для всех открытых элементов арi пишите dос - комментарии
- •Глава 7 Общие вопросы программирования
- •Сводите к минимуму область видимости локальных переменных
- •Изучите библиотеки и пользуйтесь ими
- •Не используйте строку там, где более уместен иной тип
- •При конкатенации строк опасайтесь потери производительности
- •Для ссыпки на объект используйте его интерфейс
- •Соблюдайте осторожность при использовании машинно-зависимых методов
- •Соблюдайте осторожность при оптимизации
- •Глава 8 Исключения
- •Используйте исключения лишь в исключительных ситуациях
- •Применяйте обрабатываемые исключения для восстановления, для программных ошибок используйте исключения времени выполнения
- •Избегайте ненужных обрабатываемых исключений
- •Предпочитайте стандартные исключения
- •Инициируйте исключения, соответствующие абстракции
- •Для каждого метода документируйте все инициируемые исключения
- •В описание исключения добавляйте информацию о сбое
- •Добивайтесь атомарности методов по отношению к сбоям
- •Не игнорируйте исключений
- •Глава 9 Потоки
- •Синхронизируйте доступ потоков к совместно используемым изменяемым данным
- •Избегайте избыточной синхронизации
- •Никогда не вызывайте метод wait вне цикла
- •Не попадайте в зависимость от планировщика потоков
- •При работе с потоками документируйте уровень безопасности
- •Избегайте группировки потоков
- •Глава 10 Сериализация
- •Соблюдайте осторожность при реализации интерфейса SerializabIe
- •Рассмотрите возможность использования специализированной сериализованной формы
- •Метод readObject должен создаваться с защитой
- •При необходимости создавайте метод readResolue
Не используйте строку там, где более уместен иной тип
Тип String создавался для того, чтобы представлять текст, и делает он это прекрасно. Поскольку строки широко распространены и имеют хорошую поддержку в языке Java, возникает естественное желание использовать строки для решения тех задач, для которых они не предназначались. В этой статье обсуждается несколько операций, которые не следует проделывать со строками.
Строки - плохая замена другим типам значений. Когда данные попадают в программу из файла, сети или с клавиатуры, они часто имеют вид строки. Естественным является стремление оставить их в том же виде, однако это оправданно лишь тогда, когда данные по своей сути являются текстом. Если получены числовые данные,
141
При конкатенации строк опасайтесь потери производительности
Оператор конкатенации строк (+) - удобный способ объединения нескольких строк в одну. Он превосходно справляется с генерацией отдельной строки для вывода и с созданием строкового представления для небольшого объекта с фиксированным размером, но не допускает масштабирования. Время, которое необходимо оператору конкатенации для последовательного объединения n строк, пропорционально квадрату числа n. К сожалению, это следствие того факта, что строки являются неизменяемыми (статья 13). При объединении двух строк копируется содержимое обеих строк.
Например, рассмотрим метод, который создает строковое представление для выписываемого счета, последовательно объединяя строки для каждого пункта в счете:
// Неуместное объединение строк - плохая производительность
public String statement() {
String s = “ ” ;
for (int i = 0; i < numItems(); i++)
s += lineForItem(i); // Объединение строк
return s;
Если количество пунктов велико, этот метод работает очень медленно. Чтобы добиться приемлемой производительности, создаваемое представление счета должно храниться в классе StringBuffer, а не String:
public String statement() {
StringBuffer s = new StringBuffer(numItems() * LINE_WIDTH);
for (int i = 0; i < numItems(); i++)
s.append(lineForItem(i));
return s.toString();
Изменение производительности впечатляет. Если число пунктов (nиmItems) равно 100, а длина строки (lineForItem) постоянна.и равна 80, то на моей машине второй метод работает в девяносто раз быстрее первого. Поскольку первый метод демонстрирует квадратичную зависимость от количества пунктов, а второй - линейную, разница в производительности при большем количестве пунктов становится еще более разительной. Заметим, что второй метод начинается с предварительного размещения в памяти объекта StringBuffer, достаточно крупного, чтобы в нем поместился результат вычислений. Даже если отказаться от этого и создать StringBuffer, имеющий размер по умолчанию, он будет работать в сорок пять раз быстрее, чем первый метод.
144
Мораль проста: не пользуйтесь оператором конкатенации для объединения большого Числа строк, если производительность имеет важное значение. Лучше применять метод append из Класса Str1ngBuffer. В качестве альтернативы можно использовать массив символов или обрабатывать строки по одной, не объединяя их.