Эккель Брюс
Шрифт:
Теперь класс Staff может проверять объекты с неопределенным состоянием при заполнении вакансий:
//: typeinfo/Staff.java
import java util.*;
public class Staff extends ArrayList<Position> {
public void addCString title, Person person) { add(new PositionCtitle, person)),
}
public void add(String.. titles) { for(String title : titles)
add(new PositionCtitle));
}
public StaffCString. titles) { add(titles); }
public boolean positionAvailable(String title) { for(Position position : this)
if(position.getTitleO.equals(title) &&
position.getPersonO == Person.NULL) return true;
return false,
}
public void fillPosition(String title, Person hire) { for(Position position ; this)
if(position.getTitleO.equals(title) &&
position.getPersonO == Person.NULL) { position.setPerson(hire); return;
}
throw new RuntimeException(
"Position " + title + " not available");
}
public static void main(String[] args) {
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 + " может чистить крышу";