繁体   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