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是一个很好的实践,为什么要避免它呢?