2015-09-04 94 views
1

因此,我現在有2個類別(將來可能會有更多類似),它們都表示來自跟蹤的數據如何避免在包裝類上執行的每種方法都檢查包裝對象

private Track track; 
private TrackSearchResult trackSearchResult; 

這些類是從Json Schema自動生成的。他們沒有關係,但他們包含類似的方法。

所以我創建了一個封裝類來封裝它們,所以我只有一個類用於一切(如播放音軌)。

public class ExoPlayerTrack implements IPlayerTrack { 


private Track track; 
private TrackSearchResult trackSearchResult; 


public ExoPlayerTrack(Track track) { 
    this.track = track; 
} 

public ExoPlayerTrack(TrackSearchResult trackSearchResult) { 
    this.trackSearchResult = trackSearchResult; 
} 



@Override 
public String getTrackName() { 
    if (track != null) { 
     return track.getName(); 
    } else if (trackSearchResult != null) { 
     return trackSearchResult.getTrackName(); 
    } else { 
     return null; 
    } 
} 

我已經定義了一個接口IPlayerTrack,它具有兩個相似的Track類之間的通用方法。

public interface IPlayerTrack { 
    public String getTrackName(); 
    public String getReleaseName(); 
    public String getArtistName(); 
    public String getTrackId(); 
    public String getReleaseId(); 
    public String getArtistId(); 
    public String getImageUrl(); 
    public long getDuration(); 
    } 

所以我需要首先爲空看到從兩個軌道類是用來初始化包裝類,這是非常討厭的檢查,以實現該接口的每個方法。
有什麼辦法可以避免不觸及自動生成的模型類?也許使用Java 8或Guava或設計模式?

@Override 
    public String getReleaseName() { 
     if (track != null) { //AVOID 
      return track.getReleaseName(); 
     } else if (trackSearchResult != null) { 
      return trackSearchResult.getReleaseName(); 
     } else { 
      return null; 
     } 
    } 

@Override 
public String getTrackName() { 
    if (track != null) { 
     return track.getName(); 
    } else if (trackSearchResult != null) { 
     return trackSearchResult.getTrackName(); 
    } else { 
     return null; 
    } 
} 

請注意,在某些情況下,方法名稱也稍有不同(getName/getTrackName)。

+0

爲什麼不檢查你得到Track對象的地方是否爲空?檢查對象是否爲空是一種很好的做法,爲什麼要避免它? –

回答

4

你應該簡單地定義兩個不同的包裝類,它們都實現相同的接口:一個包裝Track,另一個包裝TrackSearchResult。

除了在構造函數中(如果給定的Track或TrackSearchResult爲null,應該拋出NullPointerException),不需要進行空檢查。

1

您是否考慮過使用Optional

interface Track { 

    public void play(); 
}; 

public void test() { 
    Track a = null; 
    Track b = new Track() { 

     @Override 
     public void play() { 
      System.out.println("Play"); 
     } 

    }; 
    Optional.<Track>ofNullable(a).orElse(b).play(); 
} 

它比@ JBNizet的建議更像是一種語法糖塗層,但它是一種選擇。