Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Готовые отчеты (2020) / Java. Лабораторная работа 6.pdf
Скачиваний:
59
Добавлен:
29.01.2021
Размер:
659.05 Кб
Скачать

Рисунок 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