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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Staff staff = new Staff("President", "СТО",

"Marketing Manager", "Product Manager". "Project Lead", "Software Engineer", "Software Engineer", "Software Engineer", "Software Engineer", "Test Engineer", "Technical Writer"); sta ff.fi11Pos i t i on("Pres i dent".

new PersonCMe", "Last". "The Top, Lonely At")); staff.fi11Position("Project Lead".

new PersonC"Janet". "Planner". "The Burbs")); if(staff.positionAvailableC"Software Engineer")) staff.fi11Position("Software Engi neer". new PersonO'Bob". "Coder". "Bright Light City"));

System.out.printin(staff).

}

} /* Output:

[Position: President Person: Me Last The Top. Lonely At. Position.

СТО NullPerson. Position: Marketing Manager NullPerson. Position: Product Manager NullPerson. Position. Project Lead Person: Janet Planner The Burbs. Position: Software Engineer Person: Bob Coder Bright Light City. Position: Software Engineer NullPerson. Position: Software Engineer NullPerson. Position- Software Engineer NullPerson. Position. Test Engineer NullPerson. Position: Technical Writer NullPerson] *///.-

Обратите внимание: в некоторых местах нам по-прежнему приходится проверять объекты на определенное состояние, что принципиально не отличается от проверки null, но в других местах, скажем, при преобразованиях toStringO), лишние проверки не нужны; мы просто считаем, что ссылка на объект действительна.

Если вместо конкретных классов используются интерфейсы, для автоматического создания объектов с неопределенным состоянием можно воспользоваться динамическим посредником. Допустим, имеется интерфейс Robot, определяющий имя и модель робота, а также список List<Operation>, определяющий, какие операции выполняет робот. Операция состоит из описания и команды:

//: typeinfo/Operation java

public interface Operation { String description): void commandO; } ///.-

Чтобы воспользоваться услугами робота, следует вызвать метод operations:

//: typeinfo/Robot.java import java.util *; import net.mindview util.*:

public interface Robot { String nameO, String model О; List<Operation> operationsO: class Test {

public static void test(Robot r) { if(r instanceof Null)

System.out.pri ntin("[Nul1 Robot]"). System.out.println("Ha3BaHMe- " + r.nameO); System, out. pri nti n( "Модель " + r.model О). for(Operation operation : r.operationsO) {

System, out. pri nti n(operati on description)): operation.commandO;

}

}

}

} ///.-

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

// typeinfo/SnowRemovalRobot java import java util.*.

public class SnowRemovalRobot implements Robot { private String name.

public SnowRemovalRobot(String name) {this name = name,} public String nameО { return name; } public String model О { return "SnowBot Series 11". } public List<Operation> operations О { return Arrays.asListC

new OperationO {

public String description) {

return name + " может убирать снег",

}

public void commando {

System out.println(name + "

убирает снег"),

}

}.

new OperationO {

public String descriptionO {

return name + " может колоть лед".

}

public void commando {

System out println(name + " колет лед");

}

ь

new OperationO {

public String descriptionO {

return name + " может чистить крышу";

}

public void commando {

System out.println(name + " чистит крышу"),

}

}

);

}

public static void main(String[] args) {

Robot Test.test(new SnowRemovalRobot("SIusher"));

}

} /* Output: Название: Slusher Модель: SnowBot Series 11 Slusher может убирать снег Slusher убирает снег Slusher может колоть лед-Si usher колет лед Slusher может чистить крышу Slusher чистит крышу *///:-

Предполагается, что существуют разные типы роботов, и для каждого типа Robot объект с неопределенным состоянием должен делать что-то особенное — в нашем примере выдавать информацию о конкетном типе Robot, представленном объектом. Эта информация перехватывается динамическим посредником:

//: typeinfo/NullRobot.java

// Использование динамического посредника для создания

// объекта с неопределенным состоянием import java.lang.reflect *, import java util *, import net.mindview util.*;

class NullRobotProxyHandler implements InvocationHandler { private String null Name; private Robot proxied = new NRobotO. NullRobotProxyHandler(CIass<? extends Robot> type) {

nullName = type getSimpleNameO + " NullRobot";

}

private class NRobot implements Null, Robot {

public String nameO { return nullName; } public String model О { return nullName; } public List<Operation> operations О {

return Col lections.emptyList;

}

}

public Object

invoke(Object proxy, Method method, Object[] args) throws Throwable {

return method.invoke(proxied, args);

public class NullRobot { public static Robot

newNullRobot(CIass<? extends Robot> type) {

return (Robot)Proxy.newProxyInsta nee(

NullRobot class.getClassLoaderO, new Class[]{ Null.class, Robot.class }, new Nul1RobotProxyHandler(type));

}

public static void main(String[] args) { Robot[] bots = {

new SnowRemova1 Robot("SnowBee"), newNul1 Robot(SnowRemova1 Robot.class)

}:

for(Robot bot : bots)

Robot.Test.test(bot),

}

} /* Output-Название: SnowBee Модель: SnowBot Series 11 SnowBee может убирать снег SnowBee убирает снег SnowBee может колоть лед SnowBee колет лед SnowBee может чистить крышу SnowBee чистит крышу [Null Robot]

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

Путь эльдар: Омнибус

Торп Гэв
Warhammer 40000
Фантастика:
эпическая фантастика
4.50
рейтинг книги
Путь эльдар: Омнибус

Цивилизация статуса (сборник)

Шекли Роберт
Сборники Роберта Шекли
Фантастика:
фэнтези
8.22
рейтинг книги
Цивилизация статуса (сборник)

Легенды древнего Хенинга (сборник)

Олди Генри Лайон
Фантастика:
научная фантастика
5.00
рейтинг книги
Легенды древнего Хенинга (сборник)

Франкенштейн: Антология

Шелли Мэри
1. Лучшее
Фантастика:
социально-философская фантастика
научная фантастика
ужасы и мистика
7.43
рейтинг книги
Франкенштейн: Антология

Аальхарнская трилогия. Трилогия

Петровичева Лариса
Фантастика:
фэнтези
7.87
рейтинг книги
Аальхарнская трилогия. Трилогия

НКВД-МВД СССР в борьбе с бандитизмом и вооруженным националистическим подпольем на Западной Украине, в Западной Белоруссии и Прибалтике (19

Кокурин А. И.
Научно-образовательная:
история
5.00
рейтинг книги
НКВД-МВД СССР в борьбе с бандитизмом и вооруженным националистическим подпольем на Западной Украине, в Западной Белоруссии и Прибалтике (19

От Пекина до Берлина. 1927–1945

Чуйков Василий Иванович
Маршалы Сталина
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
От Пекина до Берлина. 1927–1945

"Фантастика 2025-106" Компиляция. Книги 1-15

Александрова Марина
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
постапокалипсис
фэнтези
5.00
рейтинг книги
Фантастика 2025-106 Компиляция. Книги 1-15

Африканский казак

Лаптухин Виктор Владимирович
Приключения:
исторические приключения
5.00
рейтинг книги
Африканский казак

Прозрение (сборник)

Ле Гуин Урсула Кребер
12. Вся Ле Гуин
Фантастика:
фэнтези
6.25
рейтинг книги
Прозрение (сборник)

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Warhammer: Битвы в Мире Фэнтези. Омнибус. Том 2

Коллектив авторов
Warhammer Fantasy Battles
Фантастика:
фэнтези
5.00
рейтинг книги
Warhammer: Битвы в Мире Фэнтези. Омнибус. Том 2

Золотой ворон

Сакавич Нора
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Золотой ворон

Том 38. Полное собрание сочинений.

Толстой Лев Николаевич
Проза:
классическая проза
5.00
рейтинг книги
Том 38. Полное собрание сочинений.