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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Безымянные внутренние классы

Описанный пример идеально подходит для демонстрации преимуществ внутренних классов (описанных в главе 10). Для начала создадим метод filter, который возвращает ссылку на объект FilenameFilter:

// io/DirList java

II Использование безымянных внутренних классов

II {Параметры "D *\ java"}

import java util regex *,

import java io *.

import java util *,

public class DirList {

public static void main(String[] args) { File path = new FileC" ").

Stri ng[] list. продолжение & if(args length == 0)

list = path listO.

else

list = path list(new Di rFi1ter(args[0])): Arrays.sort(1i st, Stri ng.CASE_INSENSITIVE_ORDER); for(String dirltem . list)

System out println(dirltem);

class DirFiIter implements FilenameFilter { private Pattern pattern, public Di rFilter(String regex) {

pattern = Pattern.compile(regex);

}

public boolean accept(File dir. String name) { return pattern.matcher(name).matchesО;

}

} /* Output. DirectoryDemo.java DirList.java DirList2.java Di rLi st3.java *///:-

Заметьте, что аргумент метода filter должен быть неизменным (final). Это необходимо для того, чтобы внутренний класс смог получить к нему доступ даже за пределами области определения аргумента.

Несомненно, структура программы улучшилась хотя бы потому, что объект FilenameFilter теперь неразрывно связан с внешним классом DirList2. Впрочем, можно сделать следующий шаг и определить безымянный внутренний класс как аргумент метода list, в результате чего программа станет еще более компактной:

//: io/Dirl_ist3.java

// Создание безымянного внутреннего класса "на месте".

// {Параметры: "D.*\.java"}

import java.util.regex.*;

import java.io.*;

import java.util.*;

public class DirList3 {

public static void main(final String[] args) { File path = new File(V); String[] list; if(args.length == 0)

list = path.listO;

else

list = path.list(new FilenameFilterО {

private Pattern pattern = Pattern.compile(args[0]); public boolean accept(File dir, String name) { return pattern.matcher(name).matches;

}

}):

Arrays.sort(1i st. Stri ng.CASE_INSENSITIVE_ORDER); for(String dirltem : list)

System out println(dirltem).

}

} /* Output. DirectoryDemo.java DirList java DirList2.java DirList3.java */// ~

На этот раз неизменным (final) объявлен аргумент метода main, так как безымянный внутренний класс использует параметр командной строки (args[0]) напрямую.

Именно так безымянные внутренние классы позволяют быстро создать «одноразовый» класс, полезный только для решения одной конкретной задачи. Одно из преимуществ такого подхода состоит в том, что весь код, решающий некоторую задачу, находится в одном месте. С другой стороны, полученный код не слишком хорошо читается, поэтому при их использовании необходимо действовать осмотрительно.

Проверка существования и создание каталогов

Класс File не ограничивается представлением существующих файлов или каталогов, он способен на большее. Он также может использоваться для создания нового каталога или даже дерева каталогов, если последние не существуют. Можно также узнать свойства файлов (размер, дату последнего изменения, режим чтения (записи)), определить, файл или каталог представляет объект File, удалить файл. Следующая программа демонстрирует некоторые методы класса File (за полной информацией обращайтесь к документации JDК, доступной для загрузки с сайта java.sun.com):

//: io/MakeDirectories.java // Использование класса File для создания // каталогов и выполнения операций с файлами. // {Параметры: MakeDirectoriesTest} import java io.-*;

public class MakeDirectories {

private static void usageO { System.err.printl n(

,,Иcпoльзoвaниe:MakeDirectories путь1 ...\n" + "Создает все пути\п" +

"Иcпoльзoвaниe:MakeDirectories -d путь1 ...\n" + "Удаляет все пути\п" +

"Использование:Маке01rectories -г путь1 путь2\п" + "Переименовывает путь1 в путь2\п"; System.exit(l),

}

private static void fileDataCFile f) { System.out.printl n(

"Полное имя: " + f.getAbsolutePath +

"\n доступно для чтения: " + f.canReadO +

"\n доступно для записи: " + f.canWriteO +

"\п имя файла getNameO. " + f.getNameO +

"\n родительский каталог getParentO: " + f.getParentO +

"\п путь getPathO " + f getPathO + "\п размер " + f length О + "\n последнее изменение " + f lastModifiedO). if(f isFileO)

System out printin("Это файл"), else if(f isDirectoryO)

System out println("3io каталог").

}

public static void main(String[] args) { if(args length < 1) usageO, if(args[0] equals("-r")) {

if(args length != 3) usageO. File

old = new File(args[l]). rname = new File(args[2]). old.renameTo(rname); fileData(old). fileDataCrname). return. // Выход из метода main

}

int count = 0; boolean del = false. if(args[0] equals("-d")) { count++, del = true.

}

count--;

while(++count < args length) {

File f = new File(args[count]). if(f existsO) {

System out println(f + " существует"); if(del) {

System out рппШСудаление " + f); f deleted;

else { // He существует i f(!del) {

f.mkdirsO.

System.out ргШ1п("создано " + f);

fileData(f).

} /* Output:

создано MakeDirectoriesTest

Полное имя: d'\aaa-TIJ4\code\io\MakeDirectoriesTest доступно для чтения- true доступно для записи, true имя файла getNameO MakeDirectoriesTest родительский каталог getParentO null путь getPathO MakeDirectoriesTest размер 0

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

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

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

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

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4

Виконт. Книга 3. Знамена Легиона

Юллем Евгений
3. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Виконт. Книга 3. Знамена Легиона

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

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Афганский рубеж 4

Дорин Михаил
4. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Афганский рубеж 4

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

На обочине 40 плюс. Кляча не для принца

Трофимова Любовь
Проза:
современная проза
5.00
рейтинг книги
На обочине 40 плюс. Кляча не для принца

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Шайтан Иван 2

Тен Эдуард
2. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шайтан Иван 2