我有一个已经弃用的实用类OldRemote
,但在新的类NewRemote
稳定之前,它仍然会被使用一段时间。这两个实用程序类具有相同的方法名称和参数,但返回类型pojo类不同。即使返回类型pojo结构是相同的,但命名是不同的。
简单地说,这两种函数返回类型都是具有不同字段名的pojo类型。
在下面的用例中,有什么通用的方法来处理这个问题吗?
我已经创建了一个服务接口,它具有新旧类的泛型方法契约。
public interface RemoteService {
//contract [ return type is object to receive all/any Pojo classes ]
Object turnOnTV();
static Service GetRemoteservice(boolean isOldRemote){
if(isOldRemote){
return new OldRemote();
}
return new NewRemote();
}
}
OldRemote类
public class OldRemote implements RemoteService{
@Override
public OldPojo turnOnTV() {
OldPojo oldPojo = new OldPojo();
System.out.println("OldPojo");
return oldPojo;
}
}
NewRemote类
public class NewRemote implements Service{
@Override
public NewPojo turnOnTV() {
NewPojo newPojo = new NewPojo();
System.out.println("NewPojo");
return newPojo;
}
}
上述实现的演示用法。
public class DemoTvRemote {
public static void main(String[] args) {
RemoteService remoteService1 = RemoteService.GetRemoteservice(true);
OldPojo oldRemote = (OldPojo) remoteService1.turnOnTV();
RemoteService remoteService2 = RemoteService.GetRemoteservice(false);
NewPojo shr = (NewPojo) Service2.test();
}
}
上面的代码运行良好。但问题是,我不想在我的整个代码库中使用turnOnTV()
的所有地方都进行类型转换。即使我不得不这样做,我也必须编写一个条件来在OldPojo
和NewPojo
之间切换,无论turnOnTV()
是在哪里被调用的。
有没有办法解决这个问题?
发布于 2019-04-07 15:01:02
您可以创建一个基类或接口,它们都可以扩展/实现。
public abstract class RemoteServiceBase<E> {
public abstract E turnOnTv();
}
public class NewRemoteService extends RemoteServiceBase<NewRemotePojo >{
public NewRemotePojo turnOnTv() {
return new NewRemotePojo();
}
}
public class OldRemoteService extends RemoteServiceBase<OldRemotePojo >{
public OldRemotePojo turnOnTv() {
return new OldRemotePojo();
}
}
只有在您知道服务类型的情况下,这才会起作用。否则,您将像预期的那样使用通用泛型类型。
发布于 2019-04-07 21:56:32
我们可以使用以下方法来处理此问题:
1)我们可以在一个公共位置创建一个虚拟的POJO类,将OldPojo和NewPojo的引用都作为数据成员
public class CommonPojo {
OldPojo oldPojo;
NewPojo newPojo;
public void setOldPojo(OldPojo oldPojo){
this.oldPojo=oldPojo;
}
public void setNewPojo(NewPojo newPojo){
this.newPojo=newPojo;
}
public OldPojo getOldPojo(){
return oldPojo;
}
public NewPojo getNewPojo(){
return newPojo;
}
}
2)我们可以像下面这样写一个Utility方法,它可以给出一个commonpojo的对象:
public class CommonRemote {
public static CommonPojo turnOnTv(Boolean isOldRemote){
CommonPojo commonPojo = new CommonPojo
if(isOldRemote){
OldPojo oldPojo =new OldPojo();
commonPojo.setOldPojo(oldPojo);
}else{
NewPojo newPojo =new NewPojo();
commonPojo.setNewPojo (newPojo);
}
}
}
3)将此方法作为turnOnTv()使用,如下所示:
public class DemoTvRemote {
public static void main(String[] args) {
CommonPojo remote1 = CommonRemote.turnOnTv(true);
OldPojo oldRemote = remote1.getOldPojo();
CommonPojo remote2 = CommonRemote.turnOnTv(false);
NewPojo newRemote = remote2.getNewPojo();
}
}
使用这种方法,只需很少的代码更改,我们就可以在不进行任何类型转换的情况下满足您的需求。
https://stackoverflow.com/questions/55556337
复制相似问题