Чтение онлайн

ЖАНРЫ

Философия Java3

Эккель Брюс

Шрифт:

Существует один фактор, который следует учитывать при работе с JVM на платформе MS Windows. Для вывода сообщений на консоль используется кодировка символов DOS (ср866). Так как для Windows по умолчанию принята кодировка Windows-1251, то очень часто бывает так, что русскоязычные сообщения не удается прочитать с экрана, они будут казаться иероглифами. Для исправления ситуации можно перенаправлять поток вывода следующим способом: java HelloDate > result, txt, тогда вывод программы окажется в файле result.txt (годится любое другое имя) и его можно будет прочитать. Этот подход применим к любой программе. Или же просто используйте одну из множества программ-«знакогенераторов» (например, keyrus), работая с экраном MS-DOS. Тогда вам не потребуются дополнительные действия по перенаправлению. Плюс станет возможной

работа под отладчиком JDB. Третий вариант, более сложный, но обеспечивающий вам независимость от машины, заключается во встраивании перекодирования в свою программу посредством методов setOut и setErr (обходит байт-ориентированность потока PrintStream). Российские программисты давно (а отсчет идет с 1997 года) приспособились к этой ситуации. Одно из решений, позволяющее печатать на консоль в правильной кодировке, можно найти на сайте www.javaportal.ru (статья «Русские буквы и не только...»). (Нужно загрузить классCodepagePrintStream.java, скомпилировать его и описать в переменной окружения. Данный путь лучше отложить до ознакомления с соответствующей темой (глава 12).) —
Примеч. ред.

Инструмент, который я создал на языке Python (подробнее на www.Python.org), распоряжается этой информацией для распределения файлов по папкам и создания файлов сборки. Вдобавок все файлы хранятся в системе CVS и автоматически вставляются в книгу с помощью макроса VBA (Visual Basic For Applications). Такой подход позволяет улучшить поддержку кода, особенно из-за использования CVS.

Находится по адресу java.sun.com/docs/codeconv/index.htmL Для экономии места в данной книге и на слайдах для семинаров я следовал не всем рекомендациям.

Джон Кирхем пишет: «Я начал программировать в 1960 году на FORTRAN II, используя компьютер IBM 1620. В то время, в 60-е и 70-е годы, FORTRAN использовал только заглавные буквы. Возможно, это произошло потому, что большинство старых устройств ввода были телетайпами, работавшими с 5-битовым кодом Бодо, который не поддерживал строчные буквы. Буква Е в экспоненциальной записи также была заглавной и не смешивалась с основанием натурального логарифма е, которое всегда записывается маленькой буквой. Символ Е просто выражал экспоненциальный характер, то есть обозначал основание системы счисления — обычно таким было 10. В те годы программисты широко использовали восьмеричную систему. И хотя я и не замечал такого, но если бы я увидел восьмеричное число в экспоненциальной форме, я бы предположил, что имеется в виду основание 8. Первый раз я встретился с использованием маленькой е в экспоненциальной записи в конце 70-х годов, и это было очень неудобно. Проблемы появились потом, когда строчные буквы по инерции перешли в FORTRAN. У нас существовали все нужные функции для действий с натуральными логарифмами, но все они записывались прописными буквами».

 Перегрузку (overloading), то есть использование одного идентификатора для ссылки на разные элементы в одной области действия, следует отличать от замещения (overriding) — иной реализации метода в подклассе первоначально определившего метод класса. — Примеч. ред.

Некоторые демонстративно пишут 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, и найти методы базовых классов стало проще.

Поделиться с друзьями: