Чтение онлайн

ЖАНРЫ

Философия Java3

Эккель Брюс

Шрифт:

spheres[i] = new ArrayList<BerylliumSphere>;

}

} ///-

Мы видим, что при при получении ссылки на List<String>[] выполняется некоторая проверка на стадии компиляции. Проблема в том, что массивы ковари-антны, поэтому List<String>[] также является Object[], поэтому вашему массиву можно присвоить ArrayList<Integer> без выдачи ошибок на стадии компиляции или выполнения.

Если вы уверены в том, что восходящее преобразование выполняться не будет, а ваши потребности относительно просты, можно создать массив параметризованных типов, обеспечивающий

простейшую проверку типов на стадии компиляции. Тем не менее параметризованный контейнер практически всегда оказывается более удачным решением, чем массив параметризованных типов.

Создание тестовых данных

При экспериментах с массивами (и программами вообще) полезно иметь возможность простого заполнения массивов тестовыми данными. Инструментарий, описанный в этом разделе, заполняет массив объектными значениями.

Arrays.fill

Класс Arrays из стандартной библиотеки Java содержит весьма тривиальный метод fill: он всего лишь дублирует одно значение в каждом элементе массива, а в случае объектов копирует одну ссылку в каждый элемент. Пример:

//• arrays/FillingArrays.java // Использование Arrays.fill О import java.util.*;

import static net.mindview.util.Print.*;

public class FillingArrays {

public static void main(String[] args) { int size = 6;

boolean[] al = new boolean[size];

byte[] a2 = new byte[size];

char[] a3 = new char[size];

short[] a4 = new short[size];

int[] a5 = new int[size];

long[] a6 = new long[size];

float[] a7 = new float[size];

doublet] a8 = new double[size];

String!] a9 = new String[size];

Arrays.fi11(al, true);

printC'al = " + Arrays.toString(al));

Arrays.fill(a2, (byte)ll);

print("a2 = " + Arrays.toString(a2));

Arrays.fill(аЗ, 'x');

print("a3 = " + Arrays toString(a3));

Arrays.fill(a4, (short)17);

print("a4 = " + Arrays.toString(a4));

Arrays.fill(a5, 19);

print("a5 = " + Arrays.toString(a5));

Arrays.fill(a6, 23);

print("a6 = " + Arrays.toString(a6));

Arrays.fill(a7. 29);

print("a7 = " + Arrays toString(a7));

Arrays.fill(a8, 47);

print("a8 = " + Arrays.toString(a8));

Arrays.fill(a9. "Hello");

print("a9 = " + Arrays.toString(a9)).

// Интервальные операции:

Arrays.fill(a9. 3. 5, "World");

print("a9 = " + Arrays.toString(a9));

}

} /* Output:

al = [true, true, true, true. true, true] a2 = [11. 11. 11. 11. 11. 11]

a3 = [x, x. x. x. x. x] продолжение &

а4 = [17. 17. 17. 17. 17. 17] а5 = [19. 19. 19. 19. 19. 19] аб = [23. 23. 23. 23. 23. 23] а7 = [29.0, 29.0. 29.0, 29.0. 29.0. 29.0] а8 = [47.0. 47.0, 47.0. 47.0. 47.0. 47.0] а9 = [Hello. Hello. Hello. Hello. Hello. Hello] a9 = [Hello. Hello. Hello. World, World. Hello] *///:-

Метод заполняет* либо весь массив, либо, как показывают две последние команды, диапазон его элементов. Но, поскольку вызывать Arrays.fill можно только для одного значения данных, полученные результаты не слишком полезны.

Генераторы данных

Чтобы создавать менее тривиальные

массивы данных с более гибкими возможностями, мы воспользуемся концепцией генераторов, представленной в главе 14. Генератор способен выдавать любые данные по вашему выбору (напомню, что он является примером паттерна «стратегия» — разные генераторы представляют разные стратегии).

В этом разделе будут представлены некоторые готовые генераторы, но вы также сможете легко определить собственный генератор для своих потребностей.

Для начала рассмотрим простейший набор счетных генераторов для всех примитивных типов и String. Классы генераторов вложены в класс Counting-Generator, чтобы они могли обозначаться именами генерируемых объектов. Например, генератор, создающий объекты Integer, будет создаваться выражением new CountingGenerator.Integer:

//: net/mi ndvi ew/uti1/Counti ngGenerator.java // Простые реализации генераторов, package net.mi ndvi ew.uti1;

public class CountingGenerator {

public static class

Boolean implements Generatorjava.lang.Boolean> { private boolean value = false; public java.lang.Boolean nextO {

value = lvalue; // Поочередное переключение return value;

}

}

public static class

Byte implements Generator<java.lang.Byte> { private byte value = 0;

public java.lang.Byte nextO { return value++; }

}

static char[] chars = ("abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray;

public static class

Character implements Generator<java.lang.Character> { int index = -1;

public java.lang.Character nextO {

index = (index + 1) % chars.length; return chars[index];

}

}

public static class

String implements Generator<java lang String> { private int length = 7;

Generator<java\lang.Character> eg = new CharacterO; public StringO {}

public String(int length) { this.length = length; } public java.lang.String nextO {

char[] buf = new char[length]; for(int i = 0; i < length; i++)

buf[i] = eg.nextO; return new java.lang.String(buf);

}

}

public static class

Short implements Generator<java.lang.Short> { private short value = 0;

public java.lang.Short nextO { return value++; }

}

public static class

Integer implements Generator<java.lang.Integer> { private int value = 0;

public java.lang.Integer nextO { return value++; }

}

public static class

Long implements Generator<java.lang.Long> { private long value = 0;

public java.lang.Long nextO { return value++; }

}

public static class

Float implements Generator<java.lang.Float> { private float value = 0; public java.lang.Float nextO { float result = value; value += 1.0; return result;

}

}

public static class

Double implements Generator java. lang Double> { private double value = O.'O; public java.lang.Double nextO { double result = value; value += 1.0; return result;

Поделиться с друзьями: