Философия Java3
вернуться

Эккель Брюс

Шрифт:

Теперь класс 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 + " может чистить крышу";

  • Читать дальше
  • 1
  • ...
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • ...

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Моя полка

  • Моя полка

Связаться

  • help@private-bookers.win