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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Пока мы ограничиваемся простым присваиванием значений полям, указанный подход работает. А если понадобится выполнить некоторые действия, свойственные конструкторам? В безымянном классе именованный конструктор определить нельзя (раз у самого класса нет имени!), но инициализация экземпляра (instance initialization) фактически позволяет добиться желаемого эффекта:

//. innerclasses/AnonymousConstructor.java

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

import static net.mindview.util.Print.*,

abstract class Base {

public Base(int i) {

print("Конструктор Base, i = " + i);

}

public abstract public void f;

}

public class AnonymousConstructor {

public static Base getBase(int i) { return new Base(i) {

{

рпгйС'Инициализация экземпляра"); } public void f {

print ("Безымянный fO").

}

}.

}

public static void main(String[] args) { Base base = getBase(47); base.fO;

}).

}

} /* Output.

Конструктор Base, i = 47

Инициализация экземпляра

Безымянный f

*///.-

В таком случае переменная i не обязана быть неизменной (final). И хотя i передается базовому конструктору безымянного класса, она никогда не используется напрямую внутри безымянного класса.

Вернемся к нашим объектам Parcel, на этот раз выполнив для них инициализацию экземпляра. Отметьте, что параметры метода destination должны быть объявлены неизменными, так как они используются внутри безымянного класса:

II- innerclasses/ParcellO.java

II Демонстрация "инициализации экземпляра" для

II конструирования безымянного внутреннего класса. продолжение &

public class Parcel 10 { public Destination

destination(final String dest, final float price) { return new Destination { private int cost,

// Инициализация экземпляра для каждого объекта. {

cost = Math round(price), if(cost > 100)

System out println("Превышение бюджета!"),

}

private String label = dest,

public String readLabelO { return label, }

}.

}

public static void main(String[] args) {

Parcel 10 p = new Parcel 100.

Destination d = p destination"Тасмания". 101 395F),

}

} /* Output-Превышение бюджета! */// -

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

Возможности безымянных внутренних классов несколько ограничены

по сравнению с обычным наследованием — они могут либо расширять класс, либо реализовывать интерфейс, но не то и другое одновременно. А если вы выберете второй вариант, реализовать можно только один интерфейс.

Снова о методе-фабрике

Посмотрите, насколько приятнее выглядит пример interfaces/Factories.java при использовании безымянных внутренних классов:

// innerclasses/Factories java import static net.mindview util Print *;

interface Service { void methodic), void method2,

}

interface SemceFactory { Service getServiceO;

}

class Implementationl implements Service { private ImplementationlO {}

public void methodic) {printC"Implementationl methodl");} public void method2 {print("Implementationl method2");}

public static ServiceFactory factory = new ServiceFactoryO {

public Service getServiceO {

return new ImplementationlO;

class Implementation2 implements Service { private Implementation20 {}

public void methodlO {print("Implementation2 methodl"),) public void method2 {print("Implementation2 method2"),j public static ServiceFactory factory = new ServiceFactoryO {

public Service getServiceO {

return new Implementation2;

public class Factories {

public static void serviceConsumer(ServiceFactory fact) { Service s = fact.getServiceO; s methodlO; s method2;

}

public static void main(String[] args) {

serviceConsumer(Implementationl.factory); // Реализации полностью взаимозаменяемы: servi ceConsumer(Implementati on2.factory);

}

} /* Output-Implementationl methodl Implementationl method2 Implementation2 methodl Implementation2 method2 */// ~

Теперь конструкторы Implementationl и Implementation2 могут быть закрытыми, и фабрику необязательно оформлять в виде именованного класса. Кроме того, часто бывает достаточно одного фабричного объекта, поэтому в данном случае он создается как статическое поле в реализации Service. Наконец, итоговый синтаксис выглядит более осмысленно.

Пример interfaces/Games.java тоже можно усовершенствовать с помощью безымянных внутренних классов:

//. innerclasses/Games.java

// Использование анонимных внутренних классов в библиотеке Game import static net.mindview.util.Print.*;

interface Game { boolean moveO; } interface GameFactory { Game getGameO; }

class Checkers implements Game { private Checkers О {} private int moves = 0;

private static final int MOVES = 3; продолжение &

class Chess implements Game { private ChessO {} private int moves = 0; private static final int MOVES = 4; public boolean moveO {

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

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

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

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

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

Законник Российской Империи. Том 2

Ткачев Андрей Юрьевич
2. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
6.40
рейтинг книги
Законник Российской Империи. Том 2

Старая школа рул

Ромов Дмитрий
1. Второгодка
Фантастика:
альтернативная история
6.00
рейтинг книги
Старая школа рул

Геном хищника. Книга девятая

Гарцевич Евгений Александрович
9. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга девятая

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

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

Прапорщик. Назад в СССР. Книга 7

Гаусс Максим
7. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 7

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Изгой Проклятого Клана. Том 3

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

По прозвищу Святой. Книга первая

Евтушенко Алексей Анатольевич
1. Святой
Фантастика:
попаданцы
альтернативная история
6.40
рейтинг книги
По прозвищу Святой. Книга первая

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

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

Представитель

Семин Никита
6. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Представитель