簡體   English   中英

Java數組對象初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM