

Рисунок 3 — Компиляция и запуск HashCodeTest.java Задание №4.
Добавим в классы векторов реализации метода клонирования Object clone(). (табл. 10, 11).
Таблица 10 — Фрагмент измененного кода vectors/Array.java
// ...
public class Array implements IVector, Serializable, Iterable<Double>, Cloneable {
//...
//Клонирование public Array clone() {
Array r = new Array(data.length);
for (int i = 0; i < data.length; ++i) { r.data[i] = data[i];
}
return r;
}
//...
}
Таблица 11 — Фрагмент измененного кода vectors/CircularLinkedList.java
// ...
public class CircularLinkedList implements IVector, Serializable, Iterable<Double>, Cloneable {
//...
//Клонирование
public CircularLinkedList clone() {
CircularLinkedList r = new CircularLinkedList(size);
for (Node temp = head.next, rtemp = r.head.next; temp != head; temp = temp.next, rtemp = rtemp.next) {
rtemp.value = temp.value;
}
return r;
}
// ...
}
Создадим файл CloneTest.java для проверки работы метода clone (табл.
12).
12

Таблица 12 — Код CloneTest.java
import vectors.Array;
import vectors.CircularLinkedList;
public class CloneTest {
public static void main(String[] args) throws Exception { Array arr1 = new Array(8), arr2 = new Array(3);
CircularLinkedList list1 = new CircularLinkedList(8), list2 = new CircularLinkedList(3);
for (int i = 0, len = arr1.size(); i < len; ++i) { arr1.set(i, i);
list1.set(i, i);
}
for (int i = 0, len = arr2.size(); i < len; ++i) { arr2.set(i, i);
list2.set(i, i);
}
System.out.print("arr1: "); arr1.print();
System.out.print("arr2: "); arr2.print();
System.out.print("list1: "); list1.print();
System.out.print("list2: "); list2.print();
System.out.print("arr1.clone(): "); arr1.clone().print(); System.out.print("arr2.clone(): "); arr2.clone().print(); System.out.print("list1.clone(): "); list1.clone().print(); System.out.print("list2.clone(): "); list2.clone().print();
}
}
Результат компиляции и запуска приведен на рис. 4.
Рисунок 4 — Компиляция и запуск CloneTest.java Задание №5.
Создадим конкретный класс-декоратор UnmodifiableVector для типа
IVector, выбрасывающий исключение UnsupportedOperationException в случае
попытки изменения состояния вектора (табл. 13). Добавим в класс со статическими методами обработки векторов реализацию метода IVector
unmodifiableVector(IVector vector), возвращающего ссылку на экземпляр
неизменяемой оболочки указанного вектора при помощи класса-декоратора (табл. 14).
13

Таблица 13 — Код vectors/UnmodifiableVector.java
package vectors;
import java.util.Iterator;
public class UnmodifiableVector implements IVector {
// Конструктор
public UnmodifiableVector(IVector arg) { this.vector = arg;
}
// Получение элемента по индексу
public double get(int i) throws VectorIndexOutOfBoundsException { return this.vector.get(i);
}
// Изменение значения элемента по индексу
public void set(int i, double value) throws UnsupportedOperationException
{
throw new UnsupportedOperationException();
}
//Получение длины вектора public int size() {
return this.vector.size();
}
//Нахождение нормы Евклида public double normEuclidean() {
return this.vector.normEuclidean();
}
//Вывод всех элементов вектора
public void print() { this.vector.print();
}
// Получение итератора public Iterator iterator() {
return this.vector.iterator();
}
protected IVector vector;
}
Таблица 14 — Фрагмент измененного кода vectors/Vectors.java
// ...
public class Vectors {
//...
//Метод, возвращающий неизменяемый вектор
public static IVector unmodifiableVector(IVector vector) { return new UnmodifiableVector(vector);
}
// ...
}
Создадим файл UnmodifiableVectorTest.java для проверки работы
метода unmodifiableVector (табл. 15).
14

Таблица 15 — Код UnmodifiableVectorTest.java
import vectors.Array;
import vectors.CircularLinkedList; import vectors.Vectors;
import vectors.IVector;
public class UnmodifiableVectorTest {
public static void main(String[] args) throws Exception { Array arr = new Array(8);
CircularLinkedList list = new CircularLinkedList(8);
IVector unmodifiableArray = Vectors.unmodifiableVector(arr); IVector unmodifiableList = Vectors.unmodifiableVector(list);
System.out.print("Unmodifiable array: "); unmodifiableArray.print(); System.out.print("Unmodifiable list: "); unmodifiableList.print();
System.out.print("Try unmodifiableArray.set(0, 1.0): "); try {
unmodifiableArray.set(0, 1.0);
} catch (UnsupportedOperationException e) { System.out.println("UnsupportedOperationException!");
}
System.out.print("Try unmodifiableList.set(0, 1.0): "); try {
unmodifiableList.set(0, 1.0);
} catch (UnsupportedOperationException e) { System.out.println("UnsupportedOperationException!");
}
}
}
Результат компиляции и запуска приведен на рис. 5.
Рисунок 5 — Компиляция и запуск UnmodifiableVectorTest.java
Заключение В результате выполнения лабораторной работы мы ознакомились с
методами класса Object и расширили функциональность имеющегося пакета.
15