Философия Java3
Шрифт:
В этом разделе будут представлены некоторые готовые генераторы, но вы также сможете легко определить собственный генератор для своих потребностей.
Для начала рассмотрим простейший набор счетных генераторов для всех примитивных типов и String. Классы генераторов вложены в класс Counting-Generator, чтобы они могли обозначаться именами генерируемых объектов. Например, генератор, создающий объекты Integer, будет создаваться выражением new CountingGenerator.Integer:
//: net/mi ndvi ew/uti1/Counti ngGenerator.java //
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;
}
}
} ///:-
Каждый класс реализует некоторое понятие «счетности». В случае Counting-Generator.Character
Следующая тестовая программа использует рефлексию с идиомой вложенных генераторов, что позволяет применять ее для любого набора генераторов, построенного по указанному образцу:
//: arrays/GeneratorsTest.java import net.mindview.util.*;
public class GeneratorsTest {
public static int size = 10;
public static void test(Class<?> surroundingClass) {
for(Class<?> type : surroundingClass.getClassesO) {
System.out.print(type.getSimpleName + ": "); try {
Generator<?> g = (Generator<?>)type.newInstance; for(int i = 0; i < size; i++)
System.out printf(g.next + " "); System, out. printlnO; } catch(Exception e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) { test(CountingGenerator.class);
}
} /* Output;
Double; 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 Float; 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 Long; 0 12 3 4 5 6 7 8 9 Integer; 0 1 2 3 4 5 6 7 8 9 Short; 0 12 3 4 5 6 7 8 9
String: abcdefg hijklmn opqrstu vwxyzAB CDEFGHI JKLMNOP QRSTUVW XYZabcd efghijk lmnopqr Character: abcdefghi j Byte: 0 12 3 4 5 6 7 8 9
Boolean: true false true false true false true false true false *///:-
Предполагается, что тестируемый класс содержит серию вложенных объектов Generator, каждый из которых имеет конструктор по умолчанию (то есть без аргументов). Рефлексионный метод getClasses выдает информацию обо всех вложенных классах. Далее метод test создает экземпляр каждого генератора и выводит результаты, полученные при десятикратном вызове next.
Следующий набор генераторов основан на случайных числах. Так как конструктор Random инициализируется константой, результаты будут повторяться при каждом запуске программы:
//: net/mi ndvi ew/uti1/RandomGenerator.java // Генераторы, выдающие случайные значения, package net.mi ndvi ew.uti1; import java.util.*;
public class RandomGenerator {
private static Random r = hew Random(47);
public static class
Boolean implements Generator<java lang Boolean> { public java lang Boolean nextO { return r nextBooleanO;