实例化时如何写一个ArrayList?

How to write an ArrayList when instantiating?

可能我是瞎了眼之类的,但我似乎无法弄清楚如何执行以下操作:

我有一个名为 Shopping 的 Class,其构造函数如下:

Shopping shopping = new Shopping(String name, ArrayList <Shop> shops)

class店铺超class4种子店铺,其构造函数是这样的:

Shop shop = new Shop(String name, double area, double income)

我的问题是:在创建购物实例时,我不知道在构造函数的数组列表部分写什么,就像我可以创建一个

Shopping s1 = new Shopping("ABCDE", ?????? <- but don't know what to write here!!!)

有什么帮助吗?

简短的回答是您需要向它传递一个您声明的类型的实例。如果该类型是 ArrayList<Shop> 那么您需要将其中之一传递给它。例如,您可以使用“new ArrayList()”创建其中一个,或者您可能有一些代码可以构建这样一个列表,或者甚至已经有一个,因为它正在对商店列表做其他事情。

但是,您说它必须是 ArrayList,这让自己陷入了困境。您应该只声​​明它采用一个列表,并且只有在商店的顺序很重要的情况下。如果顺序不重要,那么只需声明一个 Collection<Shop>。始终尽可能地声明您的参数 non-specific 。如果是Collection,那么正好有人手上有Set<Shop>,传给你,就可以了。

说明

您使用

创建对象的新实例
ArrayList<Shop> shops = new ArrayList<>();

然后你添加你的东西

shops.add(firstShop);
shops.add(secondShop);

然后你只需将变量传递给方法

Shopping s1 = new Shopping("ABCDE", shops);

或者如果你想传递一个空列表,你可以简单地在一行中完成

Shopping s1 = new Shopping("ABCDE", new ArrayList<>());

其他列表

是否有特殊原因需要将方法限制为 ArrayLists? List 还不够吗?如果你调整你也可以传递其他列表并且使用 Java 9 有一个简单的方法可以快速创建列表:

List<Shop> shops = List.of(firstShop, secondShop);
Shopping s1 = new Shopping("ABCDE", shops);

或者更紧凑:

Shopping s1 = new Shopping("ABCDE", List.of(firstShop, secondShop));

两种可能。如果您之前创建过一些商店:

Shop subShop = new Shop("Subway", 2000, 4000);
Shop bookShop = new Shop("B&N", 8000, 9000);

还有一个列表:

ArrayList<Shop> shops = new ArrayList<>();
shops.add(subShop);
shops.add(bookShop);

然后你可以这样创建它:

Shopping shopping = new Shopping("Plaza", shops);

但是,在这种情况下,我会更改 Shopping 以采用 List(甚至 Collection,如 Zag 指出的那样),而不是 ArrayList你可以这样做:

Shopping shopping = new Shopping("Plaza", List.of(subShop, bookShop));

如果将对 Shop 构造函数的调用放在对 List::of.

的调用中,您甚至可以将其全部写在一行中
Shopping shopping = new Shopping(name, new ArrayList<>());

或者如果您想要一个已经包含一些项目的列表:

List<Shop> shops = new ArrayList<>();
shops.add(new Shop(...));
shops.add(new Shop(...));
Shopping shopping = new Shopping(name, shops);

如果需要,您也可以在一行中完成:

Shopping shopping = new Shopping(name, Arrays.asList(new Shop(...), new Shop(...)));