Брюс Эккель - Философия Java3
8 Перегрузку (overloading), то есть использование одного идентификатора для ссылки на разные элементы в одной области действия, следует отличать от замещения (overriding) — иной реализации метода в подклассе первоначально определившего метод класса. — Примеч. ред.
9 Некоторые демонстративно пишут this перед каждым методом и полем класса, объясняя это тем, что «так яснее и доходчивее». Не делайте этого. Мы используем языки высокого уровня по одной причине: они выполняют работу за нас. Если вы станете писать this там, где это не обязательно, то запутаете и разозлите любого человека, читающего ваш код, поскольку в большинстве программ ссылки this в таком контексте не используются. Последовательный и понятный стиль программирования экономит и время, и деньги.
10 Запомните эту формулу, и многих проблем удастся избежать. Она означает, что если перед тем, как объект станет ненужным, необходимо выполнить некоторое завершающее действие, то это действие вам придется выполнить собственноручно. В Java нет понятия деструктора или сходного с ним, поэтому придется написать обычный метод для проведения завершающих действий. Предположим, например, что в процессе создания объект рисуется на экране. Если вы вручную не сотрете изображение с экрана, его за вас никто удалять не станет. Поместите действия по стиранию изображения в метод finalize(); тогда при удалении объекта сборщиком мусора оно будет выполнено и рисунок исчезнет, иначе изображение останется.
Может случиться так, что память объекта никогда не будет освобождена, потому что программа даже не приблизится к точке критического расхода ресурсов.
11 Джошуа Блош в своей книге (в разделе «Избегайте финализаторов») высказывается еще решительнее: «Финализаторы непредсказуемы, зачастую опасны и чаще всего не нужны». Effective Java, стр. 20 (издательство Addison-Wesley, 2001).
12 Этот термин предложил Билл Веннерс (www.artima.com) во время семинара, который мы проводили с ним вместе.
Конечно, проверка каждого массива на соблюдение границ требует времени и дополнительного кода, и отключить ее невозможно. Это может снизить быстродействие программы, у которой в критичных (по времени) местах активно используются массивы. Но проектировщики Java решили, что для безопасности Интернета и продуктивности программиста такие издержки себя оправдывают.
Использовать Java-интерпретатор не обязательно. Существует несколько компиляторов, создающих единый исполняемый файл.
13 На самом деле доступ private или protected могут иметь внутренние классы, но это особый случай (см. главу 8).
14 Эта концепция внутренних классов сильно отличается от концепции вложенных классов С++, которые представляют собой простой механизм для сокрытия имен. Вложенные классы С++ не имеют связи с объектом-оболочкой и прав доступа к его элементам.
15 Близкий аналог вложенных классов С++, за тем исключением, что в Java вложенные классы способны обращаться к закрытым членам внешнего класса.
16 Я всегда решал эту задачу с особым удовольствием; она впервые появилась в одной из первых моих книг С++ Inside & Out, но Java-реализация выглядит гораздо элегантнее.
17 Механизм обработки исключений в языке С++ не имеет аналога finally, поскольку опирается на деструкторы в такого рода действиях.
18 Деструктор — специальная функция, вызываемая при завершении работы с объектом. Всегда точно известно, где и когда вызывается деструктор. В языке С# (который гораздо больше схож с Java) реализовано автоматическое уничтожение объектов.
19 Язык С++ стандарта ISO вводит аналогичные ограничения при возбуждении исключений унасле-' дованными версиями методов (исключения обязаны быть такими же или унаследованными от исключений базовых версий методов). Это единственный способ С++ для контроля верности описания исключений во время компиляции.
Косвенно через язык Smalltalk, после разговоров со многими опытными программистами на этом языке, и напрямую при работе с Python (www.Python.org).
20 Киз Костер, архитектор языка CDL, процитировано Бертраном Мейером, создателем языка Eiffel. http://www.elj.com/elj/vl/nl/bm/right.
21 Сказанное относится в основном к документации ранних версий Java. Теперь фирма Sun значительно улучшила HTML-документацию Java, и найти методы базовых классов стало проще.
22 Все употребляемые далее термины: «настраивание», «наслаивание», «фильтрация» или «декорирование» — по сути, означают одно и то же — перегрузку всех методов InputStream для придания дополнительной функциональности при работе с данными потоков. При этом класс FilterlnputStream осуществляет перегрузку без посторонней помощи, а данные соответствующим образом трансформируются. Подклассы FilterlnputStream могут, в свою очередь, перегрузить эти же методы и добавить дополнительные методы и поля. — Примеч. ред.
23 В стандарте Unicode 3.0 (раздел 3.8, Transformations) говорится, что UTF-8 сериализует значения в последовательность от одного до четырех байтов. Описание UTF-8 во второй редакции ISO/ IEC 10646 допускает также пятый и шестой байты, но это не является корректным для стандарта Unicode. Сказанное в двух предыдущих предложениях является особенностью именно Java-реализации UTF-8. — Примеч. ред.
24 Описываемые здесь каналы (channels) следует отличать от каналов (pipe), создаваемых классами PipedlnputStream и PipedOutputStream. Первые представляют собой еще один источник данных, а вторые налаживают обмен данными между различными процессами. — Примеч. перев.
Как уже упоминалось в главе 12, не следует путать два разных понятия — поток данных (stream) в системе ввода/вывода и поток выполнения (thread) в многозадачном окружении. — Примеч. перев.
25 Источником вдохновения послужила книга Effective Java Джошуа Блоша, издательство Addison-Wesley, 2001, с. 190.