2014-09-20 10 views
1

У меня есть класс DVD, который имеет название переменных экземпляра, artist & жанра.Разрешение атрибута класса, который будет необязательным (Basic OOP Java)

Я хочу, чтобы создать объект DVD со всеми тремя ИЛИ только с названиями и артистическими значениями.

код So Far:

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'. –

+0

Ваш атрибут 'genre' уже является необязательным, о чем свидетельствует тот факт, что вы можете оставить его« null ».Я думаю, что вы спрашиваете, как распечатать информацию о песне более читаемым образом. Если это так, подумайте над тем, чтобы переписать свой вопрос (особенно название). – abl

+0

В чем необходимость использования методов 'setXxX()'? Почему бы не использовать два разных конструктора, один из которых будет принимать два параметра 'DVD (String title, String artist) {this (title, artist," ");}' и другой конструктор, который будет принимать три параметра 'DVD (String title , String artist, String genre) {this.artist = artist; this.title = название; this.genre = genre;} 'вызывать соответствующее, как и входное, во время выполнения. –

ответ

2

код, чтобы изменить это genre поле может содержать null

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

Я вижу, что это возможно с помощью if, но это лучшая практика? Я думал, что есть какой-то конкретный трюк ООП. – JohnMc

+0

трюк заключается в том, чтобы исключить исключение null-указателя в методе, который его не выбрасывает. – 2014-09-20 13:16:55

2

Правильный способ справиться это зависит от того, чего вы хотите достичь. Если вы хотите быть Null, если набор и изменить только результат ToString в зависимости от значения genre, вы можете строить различные строки в 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. 
} 

Предполагая, что я прочитал ваш пост правильно, вы просто не хотите, чтобы отобразить нуль при запросе жанра (или любой другой). Этот код просто отобразит пустую строку.

Теперь, если вы не хотите, чтобы переменная даже отображается в распечатке, если это нуль, то:

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

Поскольку это очень простой прецедент, я думаю, вы, вероятно, хотите, чтобы фабричные методы были методами класса (статические), а не объектными. Обратите внимание, что более сложные фабрики, которые должны передавать общую ссылку на свои продукты или те, которые должны использоваться во время автоматического тестирования, могут работать лучше как объекты.