【问题标题】:Java array object initializationJava数组对象初始化
【发布时间】:2014-02-17 03:25:17
【问题描述】:

我只是想问一下,是否可以在一个命令中使用相同的构造函数初始化更多对象?

代码示例:

Tile[] tiles = new Tile(5,5)[20];

感谢您的回复。

【问题讨论】:

  • 不,这是不可能的。使用 for 循环。
  • 感谢您的快速回复。

标签: java arrays object constructor initialization


【解决方案1】:

据我所知不可能。 代码Tile[] tiles = new Tile[20]; 只是创建了一个引用数组。要填充数组,您应该创建一个Tile 对象,然后将引用分配给数组的一个索引,例如:

tiles[0] = new Tile(5,5);

如果数组的所有元素都指向同一个对象,则可以简单地使用:

Tile tiles = new Tile[20];
Arrays.fill(tiles, new Tile(5,5));

【讨论】:

  • 几乎是 JDK 库中最短的。
  • @user2899587 请注意Arrays.fill 用单个对象填充数组。
  • 出于好奇,这会用该对象的深拷贝还是浅拷贝填充整个数组?
  • @user2573153:只有浅拷贝。
【解决方案2】:

不,你必须使用循环。

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!");

Reflection 比 lambda 更不稳定,尤其是在处理子类型和基元时。 lambda 很棒。

【讨论】:

  • oops... 正在考虑确切的解决方案,但我发帖速度很慢:P
  • 这里是on TryJava8.com
【解决方案3】:

首先,甚至不可能在一行中用非空值初始化一个对象数组(好吧,除了使用{...} 或用相同的引用填充它们,但我认为这不是你想要的)

您必须先创建数组实例,然后填充数组中的单个元素:

例如

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多