К. Арнольд, Д. Гослинг - Язык программирования Java, страница 59
Описание файла
PDF-файл из архива "К. Арнольд, Д. Гослинг - Язык программирования Java", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 59 страницы из PDF
Вы можете частично предотвратить “утечку файлов”, включив в класс метод finalize, внутри котороговызывается close, — таким образом можно быть уверенным, что вне зависимости от качества работы других программистов ваш класс никогдане будет поглощать открытые файлы. Вот как это может выглядеть на практике:public class ProcessFile {private Stream File;// ...public ProcessFile(String path) {File = new Stream(path);}public void close() {if (File != null) {File.close();File = null;}}}protected void finalize() throws Throwable {super.finalize();close();}Обратите внимание: метод close написан так, чтобы его можно было вызвать несколько раз. В противном случае, если бы метод close ужеиспользовался ранее, то при вызове finalize происходила бы попытка повторного закрытия файла, что может привести к ошибкам.Кроме того, в приведенном выше примере следует обратить внимание на то, что метод finalize вызывает super.finalize.
Пусть это войдет у вас впривычку для всех методов finalize, которые вам придется писать. Если не использовать super.finalize, то работа вашего класса завершитсянормально, но суперклассы, для которых не были выполнены необходимые завершающие действия, могут вызвать сбои. Помните, вызов super.finalize — это полезное правило, применяемое даже в том случае, если ваш класс не является расширением другого класса. Помимо того, что этопослужит вам дополнительным напоминанием на будущее, вызов super.finalize в подобных ситуациях позволит в будущем породить класс,аналогичный Process File, от другого суперкласса и при этом не заботиться о переделке метода finalize.В теле метода finalize может применяться конструкция try/catch для обработки исключений в вызываемых методах, но любые неперехваченныеисключения, возникшие при выполнении метода finalize, игнорируются.
Исключения подробно рассматриваются в главе 7.Сборщик мусора может уничтожать объекты в любом порядке, а может и не уничтожать их вовсе. Память будет освобождаться в тот момент,который сборщик мусора сочтет подходящим. Отсутствие привязки к какому-то конкретному порядку позволяет сборщику мусора действоватьоптимальным образом, что позволяет снизить накладные расходы на его работу. Вы можете напрямую вызвать сборщик мусора, чтобы памятьбыла освобождена раньше (см. раздел “Управление памятью”).При завершении работы приложения вызываются методы finalize для всех существующих объектов.
Это происходит независимо от того, чтопослужило причиной завершения; тем не менее некоторые системные ошибки могут привести к тому, что часть методов finalize не будетзапущена. Например, если программа завершается по причине нехватки памяти, то сборщику мусора может не хватить памяти для поиска всехобъектов и вызова их методов finalize. И все же в общем случае можно рассчитывать на то, что метод finalize будет вызван для каждого объекта.2.10.2. Восстановление объектов в методеМетод finalize может “воскресить” объект, снова делая его используемым — скажем, включая его в статический список объектов. Подобныедействия не рекомендуются, но Java не сможет ничего сделать, чтобы предотвратить их.Тем не менее Java вызывает finalize ровно один раз для каждого объекта, даже если данный объект уничтожается сборщиком мусора повторноиз-за того, что он был восстановлен в предыдущем вызове finalize.
Если подобное восстановление объектов оказывается важным для концепциивашей программы, то происходить оно будет всего один раз — маловероятно, чтобы вы добивались от программы именно такого поведения.Если вы действительно считаете, что вам необходимо восстанавливать объекты, попробуйте тщательно пересмотреть свою программу —возможно, вы обнаружите в ней какие-то недочеты. Если же и после этого вы уверены, что без восстановления объектов никак не обойтись, топравильным решением будет дублирование или создание нового объекта, а не восстановление.
Метод finalize может создать ссылку на новыйобъект, состояние которого совпадает с состоянием уничтожаемого объекта. Так как дублированный объект создается заново, принеобходимости в будущем может быть вызван его метод finalize, который поместит еще одну копию объекта в какой-нибудь другой список — этообеспечит выживание если не самого объекта, то его точной копии.2.11.
Метод mainДетали запуска Java-приложений могут отличаться для разных систем, но всегда необходимо указать имя класса, который управляет работойприложения. При запуске программы на Java система находит и запускает метод main этого класса. Метод main должен быть объявлен как public,static и void (то есть не возвращающий никакого значения), и ему должен передаваться один аргумент типа String[]. Приведем пример методаmain, выводящего значения своих параметров:class Echo {public static void main(String[] args) {for (int i = 0; i < args.length; i++)System.out.print(args[i] = “ ”);System.out.println();}}В массиве строк содержатся “аргументы программы”.
Чаще всего они вводятся пользователем при запуске приложения. Например, в системе сиспользованием командной строки — такой, как UNIX или DOS Shell, — приложение Echo может быть вызвано следующим образом:java Echo in hereВ этой команде java является интерпретатором байт-кода Java, Echo — имя класса, а остальные параметры представляют собой аргументыпрограммы. Команда java находит откомпилированный байт-код класса Echo, загружает его в виртуальную машину и вызывает метод Echo.main саргументами, содержащимися в элементах массива String. Результат работы программы будет следующим:in hereИмя класса не включается в число строк, передаваемых main. Оно известно заранее, поскольку это имя класса приложения.Приложение может содержать несколько методов main, поскольку каждый из его классов может иметь такой метод.
Тем не менее в каждойпрограмме используется всего один метод main, указываемый при запуске, — в приведенном выше примере это был метод класса Echo.Присутствие нескольких методов main имеет положительный эффект — каждый класс может иметь метод main, предназначенный для проверкиего собственного кода, что дает превосходную возможность для модульного тестирования класса. Мы рекомендуем пользоваться подобнойтехникой в ваших программах.
/Метод main присутствует во многих примерах, приведенных в этой книге. Ограниченный объем не позволяет намприводить метод main для каждого примера, но обычно мы используем этот метод при разработке собственных классов для нетривиальныхприложений и библиотек./Упражнение 2.14Измените метод Vehicle.main так, чтобы он создавал объекты-машины для владельцев, чьи имена указаны в командной строке, и выводилинформацию о новых объектах.2.12. Метод toStringЕсли объект включает общедоступный (public) метод toString, который не получает параметров и возвращает объект String, то данный методвызывается каждый раз, когда объект этого типа встречается вместо строки в операторе + или +=. Например, следующий фрагмент выводитсодержимое массива небесных тел:static void displayBodies(Body[] bodies) {for (int i = 0; i < bodies.length; i++)System.out.println(i + “: ” + bodies[i]);}Если повнимательнее присмотреться к вызову println, можно обнаружить два неявных приведения к строковым значениям: первое — дляиндекса i и второе — для объекта Body.
Значения всех примитивных типов неявно преобразуются в объекты String при использовании вподобных выражениях.В Java не существует универсального механизма для преобразования значения типа String в объект. Разумеется, вы можете включить в класссвою собственную функцию для подобного приведения.
Обычно для этого используется некий аналог метода fromString, изменяющий текущеесостояние объекта, либо конструктор, принимающий параметр типа String, который определяет исходное состояние объекта.Упражнение 2.15Включите в класс Vehicle метод toString.Упражнение 2.16Включите в класс LinkedList метод toString.2.13. Родные методыЕсли вам потребовалось написать на Java программу, в которой должен использоваться код, написанный на другом языке программирования,или если вам приходится напрямую работать с какой-либо аппаратурой, можно прибегнуть к помощи родных (native) методов.