【问题标题】:Help constructing a class with ArrayList as a parameter帮助构造一个以ArrayList为参数的类
【发布时间】:2011-09-04 11:14:10
【问题描述】:

我已经尝试解决这个问题几个小时了,但被卡住了,因此我来这里寻求帮助。 注:我正在使用 BlueJ 来构建这些类,因为我还在学习。

我要做的是创建一个播放列表,它有两个参数:名称和曲目的 ArrayList。 然后它创建一个播放列表并将列表中的曲目(按顺序)复制到播放列表中;但到目前为止,我不希望这部分有任何帮助。

我的问题是我不确定在构造 PlayList 时如何调用 ArrayList。因为指定的类型是。

public class PlayList
{    
private String myName;
private ArrayList<Track> myTracks;
private int myDuration;

public PlayList(String name, ArrayList<Track> tracks) {
    name = myName;
    myTracks = new ArrayList<Track>();
    for (Track t : tracks) {
        myTracks.add(t);
    }
}

}

在 BlueJ 中,当我构造一个新的 PlayList 类时,它会为字符串名称和 ArrayList 曲目提供一个空字段框。字符串名称很好,因为我可以简单地输入“任何内容”,但被困在 ArrayList 轨道上?

我知道这可能不是一个非常具体的问题,但我仍在学习。

【问题讨论】:

  • 您是在问我们如何设计 GUI 以便用户可以输入一些 Track 对象的数据?

标签: java arraylist


【解决方案1】:

sunadorer 的回答应该回答您的直接问题。关于类中字段的命名约定和构造函数的参数,我有一些一般性的评论。

我不会在您的字段前加上“我的”。这有点风格问题,但我不会反对为构造函数参数使用相同的名称。引用字段时可以使用this.name区分参数和字段。

另外,在这里使用ArrayList 似乎没有必要的限制:您可以使用更通用的List 接口(@98​​7654325@ 只是其中一种实现,因此如果您想要另一个,则不必触摸PlayList有点像List 稍后 o):

public class PlayList {    

  private String name;
  private List<Track> tracks;
  private int duration;

  public PlayList(String name, List<Track> tracks) {
    this.name = name;
    this.tracks = new ArrayList<Track>(tracks);
  }
}

【讨论】:

  • 您应该再次将类型参数添加到List tracks,没有它们比在您的构造函数签名中使用ArrayList 恕我直言。
  • +1 建议使用 List 而不是 ArrayList。再进一步,有 List 会更好吗?
  • 如果他知道它是什么类型的列表,他不应该使用List,也许是List&lt;Track&gt;。这也更适合作为评论而不是答案。
  • 可能还想使用ArrayListcopy-constructor 来保存整个循环和添加内容:new ArrayList&lt;Track&gt;(tracks);
  • 刚刚查看了@Arnout 答案的来源并且类型参数已经在那里,他只是使用&lt;code&gt;&lt;pre&gt; 标签而不是4-spaces-indentation 所以所以将&lt;Track&gt; 过滤为 HTML。我编辑了他的答案,正在等待审核。
【解决方案2】:

PlayList 的构造函数想要一个 ArrayList 类型的对象,其中填充了 Track 类型的元素。因此,要创建一个播放列表,您必须提供一个已经创建的。

这取决于你的调用环境,也许你已经在那里建立了一个列表,并且可以将它放入你的 PlayList 构造函数中,但是你在任何地方都需要这样的东西:

// Create an empty list
ArrayList<Track> tracks = new ArrayList<Track>();
// Add a track. e.g. when receiving a gui event
tracks.add(track); // track was created with new Track()

或者您可能不需要/想要PlayList 对象之外的列表。您可以使用PlayList 对象来管理和封装这些对象,方法是将构造函数更改为仅自己创建一个空列表并允许其他人通过addTrack 方法向其中添加曲目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多