【问题标题】:Why use an ArrayList as a constructor parameter in Java (BlueJ)?为什么在 Java (BlueJ) 中使用 ArrayList 作为构造函数参数?
【发布时间】:2015-12-31 10:35:11
【问题描述】:

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

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

这个类的构造函数之一是

 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&lt;Track&gt; 作为构造函数的参数?这样做有什么好处?

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

【问题讨论】:

  • 很清楚。如果您有曲目列表,您可以通过将名称和列表传递给Playlist 来创建播放列表。如果您只传递名称,则必须单独添加曲目,如果您已经拥有要包含的曲目列表,则这可能是不必要的额外代码。
  • 播放列表是要播放的曲目列表和名称。所以在构建 PlayList 时传递名称和要播放的曲目列表是很自然的。它应该是 List 而不是 ArrayList,但这是另一回事。清单怎么办?您对名称所做的相同操作:使用作为参数传递的曲目列表初始化 (listTracks) 字段。
  • @Kayaman 但是不能通过创建曲目然后使用tracks.add(track1)将它们添加到播放列表来实现相同的目的吗?
  • @Prussan 当然。但是,除非您通过代码行获得报酬,否则您可能不应该编写过于冗长的代码。

标签: java arraylist parameters constructor bluej


【解决方案1】:

为什么他们使用ArrayList&lt;Track&gt;作为构造函数的参数?

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

Java 提供了几个选项来做到这一点:您可以传递一个集合、一个数组,甚至是一个迭代器。如果我正在为构造函数设计签名,我会更喜欢 Collection&lt;Track&gt; 或至少 List&lt;Track&gt;ArrayList&lt;Track&gt;,以便为调用者提供更多选项,以便他们可以将什么集合传递给我的构造函数。

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

Collections.copy(this.tracks, tracks);

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

【讨论】:

  • listTracks.addAll(tracks)将曲目复制到自己的收藏中。
  • 对,所以从本质上讲,这样做避免了必须将每个轨道单独添加到 ArrayList 的所有麻烦。我希望他们在课堂上提到这一点!
猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多