Effective Java: General Programming (2/2)


Item 51. Конкатенация строк медленна.
Конкатенация ("+") n строк выполняется за время n2 - следствие того, что строки в Java неизменяемы (immutable); когда соединяются две строки, содержимое обеих полностью копируется в новую. Поэтому если требуется объединить большое или заранее неизвестное количество строк, рекомендуется использовать StringBuilder (есть ещё StringBuffer, но он синхронизован, поэтому медленнее).


Item 52. Ссылайтесь на объекты посредством их интерфейсов.
Если существует подходящий интерфейс, то лучше объявлять все параметры, возвращаемые значения, переменные и поля именно этим интерфейсом, а не имплементирующим классом.
Хорошо:
List<Subscriber> subscribers = new Vector<Subscriber>();
Плохо:
Vector<Subscriber> subscribers = new Vector<Subscriber>();
Это делает код более гибким, позволяет сменить имплементацию изменением всего одной строки. Исключения составляют те случаи, когда используются методы, специфичные для имплементации, либо код полагается на некоторые особые свойства имплементации (например, потокобезопасность Vector-а).

Item 53. Предпочитайте интерфейсы вместо reflection.
Суть в следующем: reflection - весьма небезопасная и малопроизводительная вещь, к тому же ещё и редко необходимая. Но если уж так случилось, что без неё никуда, то лучше хотя бы ограничить её использование. В большинстве программ, использующих недоступные в compile time классы, существует некоторый интерфейс или суперкласс, через которые можно ссылаться на экземпляры этого недоступного класса. То есть предлагается создавать экземпляры через reflection, а затем работать с ними через интерфейс или суперкласс, как с любыми другими объектами.

Item 54. Применяйте нативные (native) методы с умом.
Нативные методы имеют 3 основных назначения:
  1. Обеспечение доступа к платформо-зависимым средствам.
    В целом допустимо использовать нативные методы для этого, хотя Java платформа с каждой новой версией постепенно избавляет от такой необходимости.
  2. Возможность использовать устаревшие (legacy) библиотеки.
    Тоже допустимо.
  3. Увеличение производительности приложения.
    В старых версиях Java и JVM это имело смысл, сейчас - практически нет. Java стала намного быстрее, большинство задач можно решить без нативных методов без значительных потерь в производительности.
Использование нативных методов имеет много минусов: это небезопасно, платформо-зависимо и может даже ухудшить производительность.

Item 55. Оптимизируйте с умом.
Преждевременная оптимизация - зло. Не нужно ничего оптимизировать, пока не получено правильное и надёжное, хоть и медленное, решение. Если программа хорошо спроектирована, отдельные модули можно будет оптимизировать позже, без изменений в других модулях.
И, конечно, когда действительно приходит время для оптимизации, нужно сначала выяснить (например, с помощью профайлера), в каком месте программа тратит больше всего времени. Народная мудрость: 80% времени программа проводит в 20% кода.

Item 56. Соблюдайте всеобщие соглашения о наименованиях (naming conventions).
Платформа Java имеет устоявшиеся принципы именования всего (пакетов, классов, интерфейсов, методов, ...), большую часть которых можно найти в Java Language Specification (6.8). Рекомендуется их строго соблюдать и не нарушать без веской на то причины, иначе поддерживать ваш код и использовать его API будет затруднительно.
Данный параграф содержит эти принципы, переписывать частично или полностью смысла нет.

Комментариев нет:

Отправить комментарий