[英]Java array object initialization
我只想問,是否可以在一個命令中使用相同的構造函數初始化更多對象?
代碼示例:
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); }};
如果您使用的是Java8,我相信(沒有嘗試過)您可以使用lambda表達式來為您提供類似的東西
Foo[] fooArray = fillArray(new Foo[10], i -> new Foo(10,10));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.