允许类的属性是可选的(Basic OOP Java)

时间:2014-09-20 13:04:58

标签: java oop

我有一个DVD类,它有实例变量title,artist&流派。

我希望能够使用标题和艺术家值创建一个包含所有三个 OR 的DVD对象。

代码:

class DVD {

    private String title;
    private String genre;
    private String artist;

    public String getTitle () {
        return title;
    }

    public String getGenre () {
        return genre;
    }

    public String getArtist() {
        return artist;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public void playIt() {
        System.out.println("Playing the song");
    }

    public String toString() {
        return "Title: "+ title + "\n"
              + "Genre: "+ genre + "\n"
              + "Artist: "+ artist;
    }

    public void print() {
        System.out.println(this.toString());
    }


}

主要方法:

class TestDVDs {
    public static void main (String [] args){
        DVD film = new DVD();
        film.setTitle("Some Film");
        film.setGenre("Horror");
        film.setArtist("Someone");
        film.print();
    }
}

如果我只是省略我设置流派的行,则显示为流派:null,这是不可取的

我知道这是一个基本问题,但我真的被困在这里。

4 个答案:

答案 0 :(得分:2)

更改genre字段的代码可以包含null

public String toString() {
    return "Title: "+ title + "\n"
          + "Genre: "+ (genre==null?"":genre) + "\n"
          + "Artist: "+ artist;
}

答案 1 :(得分:2)

处理它的正确方法取决于您想要实现的目标。如果您希望它为Null,除非设置并且仅根据genre的值修改toString结果,您可以在toString中构建不同的字符串,例如:

public String toString() {
    String res = "Title: "+ title + "\n";
    if ( genre != null)
    {
        res += "Genre: " + genre + "\n";
    }
}

如果您希望它默认为空字符串,您可以这样设置:

private String genre = "";

答案 2 :(得分:1)

class DVD {
    private String title;
    private String artist;
    private String genre;
    public DVD() {
        title = "";
        artist = "";
        genre = "";
    }
    // Rest of your code.
}

设置这样的构造函数只需调用new DVD()即可将所有默认值设置为引号中的任何值;

您可以设置默认值的另一种方法是在变量声明中设置它们。

class DVD {
    private String title = "";
    private String artist = "";
    private String genre = "";
    // Rest of your code.
}

假设我正确阅读了你的帖子,当你要求这种类型(或其他)时,你不希望它显示为空。这段代码只会显示一个空字符串。

现在,如果你不希望变量显示在你的打印输出中,如果它是null,那么:

public String toString() {
    String result = "";
    if (title != null) result = result + "Title: " + title + "\n";
    if (genre != null) result = result + "Genre: " + genre + "\n";
    if (artist != null) result = result + "Artist: " + artist + "\n";
    return result;
}

答案 3 :(得分:1)

听起来你想要的是factory。具体做法是:

class DvdFactory {
    public static DVD newDvd(String artist, String title){...}
    public static DVD newDvd(String artist, String title, String genre{...}
}

class Dvd {
    private String artist, title;
    public Dvd(String artist, String title){...}
}

class DvdWithGenre extends Dvd {
    private String genre;
    public DvdWithGenre(String artist, String title, String genre){
        super(artist, title);
        this.genre = genre;
    }
}

这是解决您所描述问题的OO方法。要获取新DVD,请调用DvdFactory.newDvd(...)。

由于这是一个非常简单的用例,我认为您可能希望工厂方法是类方法(静态)而不是对象方法。请注意,需要传递对其产品的公共引用的更复杂的工厂或在自动化测试期间需要使用的工厂可能更适合作为对象。