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

на главную - закладки

Жанры

Философия 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 вводит аналогичные ограничения при возбуждении исключений унасле-' дованными версиями методов (исключения обязаны быть такими же или унаследованными от исключений базовых версий методов). Это единственный способ С++ для контроля верности описания исключений во время компиляции.

Поделиться:
Популярные книги

Вперед в прошлое 8

Ратманов Денис
8. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 8

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

Кодекс Императора III

Сапфир Олег
3. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора III

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Мечник Вернувшийся 1000 лет спустя. Том 2

Ткачев Андрей Юрьевич
2. Вернувшийся мечник
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мечник Вернувшийся 1000 лет спустя. Том 2

#Бояръ-Аниме. Газлайтер. Том 37

Володин Григорий Григорьевич
37. История Телепата
Фантастика:
фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 37

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Наследник в Зеркальной Маске

Тарс Элиан
8. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник в Зеркальной Маске

Наемник

Поселягин Владимир Геннадьевич
1. Вселенная EVE Online
Фантастика:
боевая фантастика
8.50
рейтинг книги
Наемник

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Наследие Маозари 3

Панежин Евгений
3. Наследие Маозари
Фантастика:
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 3