如何避免null检查包装类

时间:2015-09-04 09:35:13

标签: java android design-patterns optimization refactoring

所以我目前有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),方法名称也略有不同。

2 个答案:

答案 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的建议更像是一种语法糖涂层,但它是另一种选择。