Java 如何避免对包装类上实现的每个方法的包装对象进行空检查

Java 如何避免对包装类上实现的每个方法的包装对象进行空检查,java,android,design-patterns,optimization,refactoring,Java,Android,Design Patterns,Optimization,Refactoring,因此,目前我有两个类(将来可能会有更多),它们都是相似的,它们都表示来自某个轨迹的数据 private Track track; private TrackSearchResult trackSearchResult; 这些类是从Json模式自动生成的。它们之间没有关系,但它们包含类似的方法 所以我创建了一个包装器类来封装这两个类,所以我只有一个类可以用于所有事情(比如播放曲目) 我定义了一个接口IPlayerTrack,它在两个类似的Track类之间具有通用方法 public interfa

因此,目前我有两个类(将来可能会有更多),它们都是相似的,它们都表示来自某个轨迹的数据

private Track track;
private TrackSearchResult trackSearchResult;
这些类是从Json模式自动生成的。它们之间没有关系,但它们包含类似的方法

所以我创建了一个包装器类来封装这两个类,所以我只有一个类可以用于所有事情(比如播放曲目)

我定义了一个接口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来实现接口的每个方法,以查看两个跟踪类中的哪个用于初始化包装器类,这非常糟糕。
在不涉及自动生成的模型类的情况下,是否有任何方法可以避免这种情况???可能使用Java8或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)。

您只需定义两个不同的包装类,它们都实现相同的接口:一个包装跟踪,另一个包装跟踪SearchResult

除了在构造函数中(如果给定的Track或TrackSearchResult为null,则应抛出NullPointerException)之外,无需再进行null检查。

您只需定义两个不同的包装类,它们都实现了相同的接口:一个包装Track,另一个包装TrackSearchResult


除了构造函数(如果给定的Track或TrackSearchResult为null,则该构造函数将引发NullPointerException)之外,不再需要进行null检查。

您是否考虑过使用
可选的

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();
}
接口跟踪{
公共虚无游戏();
};
公开无效测试(){
磁道a=null;
轨道b=新轨道(){
@凌驾
公共游戏{
系统输出打印(“播放”);
}
};
可选。不可用的(a.orElse(b.play();
}

与@JBNizet的建议相比,它更像是一种语法糖衣,但它是一种替代方案。

您是否考虑过使用
可选的

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();
}
接口跟踪{
公共虚无游戏();
};
公开无效测试(){
磁道a=null;
轨道b=新轨道(){
@凌驾
公共游戏{
系统输出打印(“播放”);
}
};
可选。不可用的(a.orElse(b.play();
}

与@JBNizet的建议相比,它更像是一种语法糖衣,但它是一种替代方法。

为什么不在获取Track对象的位置检查它是否为null`?检查对象是否为空是一种很好的做法,为什么要避免它?为什么不在获取跟踪对象的位置检查它是否为空?检查对象是否为null是一个很好的实践,为什么要避免它呢?