所以我目前有2个类(将来可能会有更多)类似它们都表示来自Track的数据
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();
}
所以我需要通过首先检查null来实现接口的每个方法,以查看哪两个Track类用于初始化非常讨厌的Wrapper类。
有没有办法可以避免触及自动生成的模型类???也许使用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 :(得分:4)
你应该简单地定义两个不同的包装类,它们都实现相同的接口:一个包装Track,另一个包装TrackSearchResult。
除了在构造函数中(如果给定的Track或TrackSearchResult为null,它应该抛出NullPointerException),不再需要null检查。
答案 1 :(得分: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的建议更像是一种语法糖涂层,但它是另一种选择。