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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

print("Chess move " + moves); return ++moves != MOVES;

}

public static GameFactory factory = new GameFactoryO { public Game getGameO { return new ChessO; }

}:

}

public class Games {

public static void piayGame(GameFactory factory) { Game s = factory.getGameO; while(s. moveO)

}

public static void main(String[] args) { pi ayGame(Checkers.factory); piayGame(Chess.factory);

}

} /* Output: Checkers move 0 Checkers move 1 Checkers move 2 Chess move 0 Chess move 1 Chess move 2 Chess move 3 *///•-

Вспомните совет, данный в конце предыдущей главы: отдавать предпочтение классам перед интерфейсами. Если архитектура системы требует применения интерфейса, вы это поймете. В остальных случаях не применяйте интерфейсы без крайней необходимости.

Вложенные классы

public boolean moveО {

print("Checkers move " + moves); return ++moves != MOVES;

}

public static GameFactory factory = new GameFactoryO { public Game getGameO { return new Checkers О; }

Если связь между объектом внутреннего класса и объектом внешнего класса не нужна, можно сделать внутренний класс статическим (объявить его как static). Часто такой класс называют вложенным15 (nested). Чтобы понять смысл ключевого слова static в отношении внутренних классов, следует вспомнить, что в объекте обычного внутреннего класса тайно хранится ссылка на объект создавшего его объемлющего внешнего класса. При использовании статического внутреннего класса такой ссылки не существует. Применение статического внутреннего класса означает следующее:

• для создания объекта статического внутреннего класса не нужен объект внешнего класса;

• из объекта вложенного класса нельзя обращаться к не-статическим членам внешнего класса.

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

//• i nnerclasses/Parcel 11.java

// Вложенные (статические внутренние) классы

public class Parcel 11 {

private static class PContents implements Contents { private int i = 11; public int valueO { return i; }

}

protected static class ParcelDestination implements Destination { private String label;

private Parcel Destination(String whereTo) { label = whereTo,

}

public String readLabelO { return label; }

// Вложенные классы могут содержать другие статические элементы;

public static void f {}

static int x = 10;

static class AnotherLevel {

public static void f {} static int x = 10;

}

}

public static Destination destination(String s) { return new ParcelDestination(s);

}

public static Contents contO {

return new Parcel Contents О,

}

public static void main(String[] args) { Contents с = contentsO, Destination d = destinationC'TacMaHHfl"),

}

} ///;-

В методе main не требуется объекта класса Parcelll; вместо этого для вызова методов, возвращающих ссылки на Contents и Destination, используется обычный синтаксис обращения к статическим членам класса.

Как было сказано ранее, в обычном (не-статическом) внутреннем классе для обращения к объекту внешнего класса используется специальная ссылка this. Во вложенном классе такая ссылка недействительна (по аналогии со статическими методами).

Классы внутри интерфейсов

Обычно интерфейс не может содержать программный код, но вложенный класс может стать его частью. Любой класс, размещенный внутри интерфейса, автоматически является public и static. Так как класс является статическим, он не нарушает правил обращения с интерфейсом — этот вложенный класс просто использует пространство имен интерфейса. Во внутреннем классе даже можно реализовать окружающий интерфейс:

//• innerclasses/ClassInlnterface.java // {main: ClassInlnterfaceSTest}

public interface Classlnlnterface { void howdyO;

class Test implements Classlnlnterface { public void howdyO {

System. out.printlnCnpHBeT!");.

}

public static void main(String[] args) { new Test О .howdyO.

}

}

} /* Output Привет! *///•-

Вложение классов в интерфейсы может пригодиться для создания обобщенного кода, используемого с разными реализациями этого интерфейса.

Ранее в книге я предлагал помещать в каждый класс метод main, позволяющий при необходимости протестировать данный класс. Недостатком такого подхода является дополнительный скомпилированный код, увеличивающий размеры программы. Если для вас это нежелательно, используйте статический внутренний класс для хранения тестового кода:

//• innerclasses/TestBed.java

// Помещение тестового кода во вложенный класс

// {main: TestBedSTester}

public class TestBed {

public void f { System.out.printlnC'fO"): } public static class Tester {

public static void main(String[] args) { TestBed t = new TestBedO; t.fO:

}

}

} /* Output: f *///:-

При компиляции этого файла создается отдельный класс с именем TestBed$ Tester (для запуска тестового кода наберите команду java TestBed$Tester). Вы можете использовать этот класс для тестирования, но включать его в окончательную версию программы необязательно; файл TestBed$Tester.class можно просто удалить перед окончательной сборкой программы.

Доступ вовне из многократно вложенных классов

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

Эргоном: Восхождение берсерка

Глебов Виктор
2. Эргоном
Фантастика:
фэнтези
попаданцы
аниме
5.20
рейтинг книги
Эргоном: Восхождение берсерка

Потрясатель вселенной

Прозоров Александр Дмитриевич
14. Ведун
Фантастика:
фэнтези
8.48
рейтинг книги
Потрясатель вселенной

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

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

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

Иной. Том 5. Адская работа

Amazerak
5. Иной в голове
Фантастика:
боевая фантастика
городское фэнтези
технофэнтези
рпг
5.00
рейтинг книги
Иной. Том 5. Адская работа

Глубокий космос

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

Наномашины, демоненок! Том 3

Новиков Николай Васильевич
3. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, демоненок! Том 3

Гримуар темного лорда II

Грехов Тимофей
2. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда II

Хозяин Стужи 5

Петров Максим Николаевич
5. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
6.60
рейтинг книги
Хозяин Стужи 5

Старшеклассник без клана. Апелляция кибер аутсайдера 3

Афанасьев Семён
3. Старшеклассник без клана. Апелляция аутсайдера
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Старшеклассник без клана. Апелляция кибер аутсайдера 3

Тринадцатый XIII

NikL
13. Видящий смерть
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Тринадцатый XIII

Кодекс Крови. Книга ХVII

Борзых М.
17. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVII

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Воплощение Похоти

Некрасов Игорь
1. Воплощение Похоти
Фантастика:
юмористическое фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Воплощение Похоти