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