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

  • 本文关键字:Basic OOP Java 许类 属性 java oop
  • 更新时间 :
  • 英文 :


我有一个DVD类,它有实例变量title,artist&体裁

我希望能够创建一个包含所有三个的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,这是不可取的

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

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

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

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

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

如果您希望默认情况下它是一个空字符串,您可以将其设置为:

private String genre = "";
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.
}

假设我读对了你的帖子,你只是不希望它在你询问类型(或其他什么)时显示为空。此代码将只显示一个空字符串。

现在,如果你甚至不想在打印输出中显示变量,如果它为空,那么:

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;
}

听起来你想要的是一个工厂。具体而言:

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(…).

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

最新更新