我想问一下,在一个命令中是否可以使用同一个构造函数初始化多个对象?
代码示例:
Tile[] tiles = new Tile(5,5)[20];
感谢回复。
我想问一下,在一个命令中是否可以使用同一个构造函数初始化多个对象?
代码示例:
Tile[] tiles = new Tile(5,5)[20];
Tile[] tiles = new Tile[20];
只是创建了一个引用数组。要填充数组,您应该创建一个Tile
对象,然后将引用分配给数组的一个索引,如下所示:tiles[0] = new Tile(5,5);
Tile tiles = new Tile[20];
Arrays.fill(tiles, new Tile(5,5));
Tile[] tiles = new Tile[20];
for(int i = 0; i < tiles.length; i++) {
tiles[i] = new Tile(5, 5);
}
不过,在Java 8中,我们将能够使用新的Supplier
类和一个帮助方法来缩短这个过程,这真是太好了。
static <E> E[] fill(E[] arr, Supplier<? extends E> supp) {
for(int i = 0; i < arr.length; i++) {
arr[i] = supp.get();
}
return arr;
}
Tile[] tiles = fill(new Tile[20], () -> new Tile(5, 5));
我认为这很棒。
如果没有使用Java 8,也有几种使用反射实现此功能的方法。 如果该类具有副本构造函数(接受其自身类对象作为参数的构造函数),则可以使用以下方法:
static <E> E[] duplicate(E[] arr, E element) {
@SuppressWarnings("unchecked")
Class<? extends E> cls = (Class<? extends E>)element.getClass();
try {
Constructor<? extends E> ctor = cls.getConstructor(cls);
for(int i = 0; i < arr.length; i++) {
arr[i] = ctor.newInstance(element);
}
} catch(Exception e) {
e.printStackTrace(System.err);
}
return arr;
}
String[] arr = fill(new String[5], "Hello world!");
反射比Lambda不稳定一些,特别是在处理子类型和基本类型时。Lambda非常好。
首先,在一行中使用非空值初始化对象数组甚至是不可能的(好吧,除非使用{...}
或使用相同引用填充它们,但我认为这不是你想要的)
你必须先创建数组实例,然后填充数组中的每个元素:
例如:
Foo[] myArray =new Foo[10];
for (int i = 0; i < myArray.length; ++i) {
myArray = new Foo();
}
如果你只是想要更短的代码,而不想一遍又一遍地写循环,这里有一个选项:
编写一个类似于这样的小工具:
public class ArrayUtil {
public static T[] fillArray(T[] array, ArrayElementFactory elementFactory) {
for (int i = 0; i< array.length; ++i) {
array[i] = elementFactory.create(i);
}
return array;
}
}
public interface ArrayElementFactory<T> {
T create(int i);
}
Foo[] fooArray = fillArray(new Foo[10], new ArrayElementFactory<Foo>() {
Foo create(int i) { return new Foo(10,10); }};
Foo[] fooArray = fillArray(new Foo[10], i -> new Foo(10,10));