Java类中的数组?

Java类中的数组?,java,arrays,class,object,Java,Arrays,Class,Object,上面是我的代码。我试图创建一个返回播放列表的java类。我希望它返回一个标题,流派,无论播放列表是私人或公共的。所有这三件事都已经在上面构建好了。但是,在这个列表中,作为第四个属性,我想添加一个数组,列出播放列表中的所有歌曲。数组已经是我在上面创建的属性(Song[]listOfSongs)。但是,我不知道如何将此数组与其他三个属性连接,以及如何将歌曲放入此数组。有什么建议吗?导入java.util.ArrayList; 公共类播放列表{ 公共最终字符串标题; 公共最终弦乐体裁; 公共播放列表;

上面是我的代码。我试图创建一个返回播放列表的java类。我希望它返回一个标题,流派,无论播放列表是私人或公共的。所有这三件事都已经在上面构建好了。但是,在这个列表中,作为第四个属性,我想添加一个数组,列出播放列表中的所有歌曲。数组已经是我在上面创建的属性(Song[]listOfSongs)。但是,我不知道如何将此数组与其他三个属性连接,以及如何将歌曲放入此数组。有什么建议吗?

导入java.util.ArrayList;
公共类播放列表{
公共最终字符串标题;
公共最终弦乐体裁;
公共播放列表;
公开最终歌曲列表;
公共播放列表(字符串tl、字符串gn、布尔priv){
title=tl;
类型=gn;
privatePlaylist=priv;
listOfSongs=newarraylist();
}
}
用法示例:

公共类主{
公共静态void main(字符串[]args){
Playlist pl=新播放列表(“标题”、“流派”,false);
pl.歌曲列表。添加(…);
系统输出打印号(pl.title);
}
}

如果不想更改歌曲,可以将其放入构造函数中:

public class Playlist 
{
    String title;
    String genre;
    Boolean privatePlaylist = true;
    Song[] listOfSongs;

    public Playlist(String tl, String gn, Boolean priv)
    {
        tl = title;
        gn = genre;
        priv = privatePlaylist;
    }

    Song[] mostPlayedSongs()
   {
       return listOfSongs;
   }

}
如果不应在构造函数中添加歌曲列表(即,需要更新),我将使用ArrayList,以便您可以更改大小:

public PlayList(String title, String genre, Boolean privatePlaylist, Song[] songs) {
    this.title = title;
    this.genre = genre;
    this.privatePlaylist = privatePlaylist; //original constructor wasn't assigning this property
    this.listOfSongs = listOfSongs;
  }
//字段:
私人歌曲列表;
//建造师
公共播放列表(字符串标题、字符串类型、布尔私有播放列表){
this.title=标题;
这个。流派=流派;
this.privatePlaylist=privatePlaylist;//原始构造函数未分配此属性
this.listOfSongs=新的ArrayList();
}
//要编辑歌曲,请执行以下操作:
公开作废歌曲列表(ArrayList歌曲列表){
this.listOfSongs=listOfSongs;
}

您的实例变量未使用构造函数参数进行初始化,因为您尚未将值分配给实例变量

按如下方式操作:

    // Field:
private ArrayList<Song> listOfSongs;

// Constructor
public PlayList(String title, String genre, Boolean privatePlaylist) {
        this.title = title;
        this.genre = genre;
        this.privatePlaylist = privatePlaylist; //original constructor wasn't assigning this property
        this.listOfSongs = new ArrayList<>();
}

// To edit the songs:
public void setListOfSongs (ArrayList<Song> listOfSongs) {
     this.listOfSongs = listOfSongs;
}
或者更为传统

public Playlist(String tl, String gn, Boolean priv){
    title = tl;
    genre = gn;
    privatePlaylist = priv;
}
我建议您使用
ArrayList
而不是数组,这样您就不必担心调整
listOfSongs
的大小。替换

public Playlist(String title, String genre, Boolean privatePlaylist){
    this.title = title;
    this.genre = genre;
    this.privatePlaylist = privatePlaylist;
}


ArrayList的使用在这里毫无帮助,因为它是私有的。要更改值,必须保留对列表的引用(在设置它之后,这会使构造函数中的新ArrayList变得多余),这在我看来不是最优的。要编辑它,可以使用getter,更新该列表,然后将其设置为新列表。或者,您可以创建一个函数来添加歌曲public void addSong(Song newSong){this.listOfSongs.add(newSong);})或删除它们,如果您有办法识别歌曲以获得索引的话。很抱歉,但我确实看不到在这里使用setter和getter的好处,只使用公共字段有什么不对?我在任何地方都见过setter/getter模式,坦率地说,我不喜欢它不必要的地方。对我来说,这完全取决于你试图对这些字段做什么。我同意有些人过分强调封装,尤其是在学校环境中。但我觉得在某些情况下,这一点很重要,而且,在不知道Song类的组成以及PlayList类的使用方法的情况下,我觉得这是一个更安全的选择。如果可以公开歌曲列表(最好是最终的,如我的回答所示),为什么要使用addSong方法呢并且能够使用其上的所有方法(例如循环、删除、添加等)
为什么要创建addSong方法
-以便您可以灵活地将歌曲添加到播放列表中,例如
播放列表playlist playlist 1=新建播放列表();播放列表1.添加歌曲(新歌(a、b、c));播放列表1.添加歌曲(新歌(x,y,z))。我希望,它能帮助您理解
addSong
方法的目的。如果有任何疑问/问题,请随时发表评论。我的意思是为什么不公开歌曲列表,然后播放列表。歌曲列表。添加(…);如果你制作一个addSong方法,你需要删除Song、allSongs、loopSongs和更多的方法,同时公开listOfSongs本身就足够了。将一个实例变量
公开
打破了OOP的基本原则。只有当你有一个
final
变量时,它才有意义。啊……我刚刚又读了你的第一条评论,意识到你提到了
final
。你的
类播放列表的代码将无法编译。您不能执行
privatePlaylist=priv
因为不可能重新分配到
final
变量。事实上,我没有注意到他对Hubert有一个值-如果其中一个答案解决了您的问题,您可以通过将其标记为已接受来帮助社区。公认的答案有助于未来的访问者自信地使用解决方案。检查以了解如何做。
Song[] listOfSongs;
List<Song> listOfSongs = new ArrayList<Song>();
public void addSong(Song song) {
    listOfSongs.add(song);
}