2014-09-20 48 views
1

我有一個DVD類,它有實例變量標題,藝術家&流派。允許一個類的屬性是可選的(基本的OOP Java)

我希望能夠創建一個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(); 
    } 
} 

如果我只是離開了,我把它顯示爲體裁的體裁行:這是不希望的空

我知道這是一個基本問題,但我真的被困在這裏。

+1

有這個漂亮的操作稱爲「if」。 – 2014-09-20 13:10:08

+0

你的'genre'屬性已經是可選的,這一點可以通過你可以將它留空。我想你所問的是如何以更可讀的方式打印關於歌曲的信息。如果是這種情況,考慮重寫你的問題(特別是標題)。 – abl 2014-09-20 13:10:24

+0

有什麼需要'setXxX()'方法?爲什麼不使用兩種不同的構造函數',一個會帶兩個參數'DVD(String title,String artist){this(title,artist,「」);}'和另一個構造函數, ,String artist,String genre){this.artist = artist; this.title = title; this.genre = genre;}'在運行時根據輸入來調用適當的。 – 2014-09-20 13:31:07

回答

2

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

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

我可以看到它可以用if來實現,但是這是最佳實踐嗎?我認爲這是一些特定的OOP技巧。? – JohnMc 2014-09-20 13:12:07

+0

訣竅是防止不拋出它的方法中的空指針異常。 – 2014-09-20 13:16:55

2

正確的方法來處理它取決於你想要達到的目標。如果你希望它是Null除非集,只修改取決於genre價值的toString結果,你可以建立不同的字符串toString,例如:

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

如果你希望它是由一個空字符串默認情況下,你可以將它這樣:

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

設置這樣的構造將只通過調用新的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; 
} 
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(...)。由於這是一個非常簡單的用例,我想你可能希望工廠方法是類方法(靜態)而不是對象方法。請注意,更復雜的工廠需要將自己產品的通用參考或需要在自動化測試中使用的工廠傳遞給對象。

相關問題