×
Traktatov.net » Философия Java » Читать онлайн
Страница 338 из 395 Настройки

}

public void setColor(int newColor) { color = newColor; } public int getColorO { return color; }

}

public class StoreCADState {

public static void main(String[] args) throws Exception { List

new ArrayList shapes = new ArrayList(); // Создание фигур, for(int i = 0; i < 10; i++)

shapes add(Shape.randomFactory()); // Назначение всех статических цветов: for(int i = 0; i < 10. i++)

((Shape)shapes.get(i)).setColor(Shape.GREEN); // Сохранение вектора состояния: ObjectOutputStream out = new ObjectOutputStream( new FileOutputStreamC'CADState.out")); out.writeObject(shapeTypes); Line.serializeStaticState(out); out.writeObject(shapes); // Вывод фигур: System out.printin(shapes);

}

} /* Output:

[class Circlecolor[3] xPos[58] yPos[55] dim[93] class Squarecolor[3] xPos[61] yPos[61] dim[29] продолжение &

. class Linecolor[3] xPos[68] yPos[0] dim[22]

. class Circlecolor[3] xPos[7] yPos[88] dim[28]

. class Squarecolor[3] xPos[51] yPos[89] dim[9]

. class Linecolor[3] xPos[78] yPos[98] dim[61]

. class Circlecolor[3] xPos[20] yPos[58] dim[16]

, class Squarecolor[3] xPos[40] yPos[ll] dim[22]

. class Linecolor[3] xPos[4] yPos[83] dim[6]

, class Circlecolor[3] xPos[75] yPos[10] dim[42] ]

*/// ~

Класс Shape реализует интерфейс Serializable, поэтому все унаследованные от него классы по определению поддерживают сериализацию и восстановление. В каждой фигуре Shape содержатся некоторые данные, и в каждом унаследованном от Shape классе имеется статическое (static) поле, которое определяет цвет фигуры. (Если бы мы поместили статическое поле в базовый класс, то получили бы одно поле для всех фигур, поскольку статические поля в производных классах не копируются.) Для задания цвета некоторого типа фигур можно переопределить методы базового класса (статические методы не используют динамическое связывание). Метод randomFactory() создает при каждом вызове новую фигуру, используя для этого случайные значения Shape.

Классы Circle и Square — простые подклассы Shape, различающиеся только способом инициализации поля color: окружность (Circle) задает значение этого поля в месте определения, а прямоугольник (Square) инициализирует его в конструкторе. Класс Line мы обсудим чуть позже.

В методе main() один список ArrayList используется для хранения объектов Class, а другой — для хранения фигур.

Восстановление объектов выполняется вполне тривиально:

// io/RecoverCADState java

// Восстановление состояния вымышленной системы CAD // {RunFirst StoreCADState} import java io.*. import java util *.

public class RecoverCADState {

@SuppressWarni ngs("unchecked")

public static void main(Stnng[] args) throws Exception { ObjectlnputStream in = new ObjectInputStream( new Fi1eInputStream("CADState.out")). // Данные читаются в том порядке, в котором они были записаны-List> shapeTypes =

(List shapes = (List)in.readObject(). System out println(shapes).