为什么在 Java (BlueJ) 中使用 ArrayList 作为构造函数参数?

Why use an ArrayList as a constructor parameter in Java (BlueJ)?

我正在尝试在 BlueJ 中完成 uni 的作业,但在第一个障碍时遇到了障碍。

在赋值中,我们得到了一个class,以及那个class的构造函数、方法和参数的名称。我们不允许更改这些,因为作业部分由测试单元(或类似的东西)标记。

此 class 的构造函数之一给出为

 public class PlayList
 {
    public PlayList(String name, ArrayList<Track> tracks) {
    }

我已经(部分)完成了

public class PlayList
{
   private String listName;
   private ArrayList<Track> listTracks = new ArrayList<Track>();

   /**
    * Constructs a playlist with a title and an ArrayList of tracks
    * 
    * @param name The name of the playlist
    * @param tracks An ArrayList of tracks in the playlist
    */
   public PlayList(String name, ArrayList<Track> tracks) {
       listName = name;
       //I really don't know what to do with the tracks parameter yet
   }

好的,所以,我从这个问题 (How do I enter parameters for an ArrayList in BlueJ?) 知道我必须创建一个 ArrayList 的实例,以便将它作为参数传递到 BlueJ 中。

我不明白的是 为什么 - 为什么他们使用 ArrayList<Track> 作为构造函数的参数?这样做有什么好处?

(我认为这样做一定有好处(如果没有功能就不会存在),但我不明白什么 是的,如果有人能向我解释一下,我将不胜感激。)

why have they used ArrayList<Track> as a parameter for the constructor?

他们这样做是为了允许调用者在单个参数中传递任意数量的 Track

Java 提供了几个选项来执行此操作:您可以传递一个集合、一个数组,甚至一个迭代器。如果我正在为构造函数设计签名,我强烈希望 Collection<Track> 或至少 List<Track> 而不是 ArrayList<Track>,以便为调用者提供更多选项,让他们可以传递什么集合给我的构造函数。

回到如何处理数组列表,您应该制作一个防御性副本。一种方法是使用 Collections.copy,像这样:

Collections.copy(this.tracks, tracks);

复制完成后,您应该遍历 this.track 的元素,并确保它们不是 null