所以我有一个用例,我需要复制类的对象(类可能会有所不同,具体取决于工厂的输入类型.
这是我想要做的样本
public interface DataUtil {
// the main wrapper
static Object copyObject(Object payload){
if(payload instanceof Human))
return copyEntry((Human) payload);
if(payload instanceof Car))
return copyEntry((Car) payload);
if(payload instanceof Planet))
return copyEntry((Planet) payload);
return payload;
}
static Human copyEntry(Human human) {
return Human.builder()
.name(human.getName())
.age(human.getAge())
.build();
}
static Car copyEntry(Car car) {
return Car.builder()
.model(car.getModel())
.brand(car.getBrand())
.build();
}
static Planet copyEntry(Planet planet) {
// return builder like previous
}
}
如果你看一下copyObject函数,它可以完成预期的工作,但是他的问题是返回类型.目前,为了使自己兼容,它返回一个Object,但我更愿意返回它特定的类Object(例如人类或汽车)
有没有办法用Generics完成这个(使用< T>)?或者这首先是一个糟糕的做法?
解决方法:
Is there a way to get this done with Generics (using )? or is this
a bad approach in the first place to do?
这是一种糟糕的方法,因为您将参数作为参数接收.
你不能从中推断具体类型:而你使用的实例.这不是一个好方法.
这里有两个想法(足够相关)
1)介绍可复制的界面
您可以引入一个接口,您要复制的对象的类实现:
public interface Copyable {
T copy(T t);
}
可以实施,如:
public class Human implements Copyable {
@Override
public Human copy(Human t) {
return Human.builder()
.name(human.getName())
.age(human.getAge())
.build();
}
}
所以一般的copy()方法可能如下所示:
// the main wrapper
static > T copyObject(T payload) {
return payload.copy(payload);
}
你可以用这种方式使用它:
Human human = new Human();
// set some fields ...
Human copiedHuman = copyObject(human); // compile
Car copiedCar = copyObject(human); // doesn't compile
2)使用访客模式
作为替代方案,它也是访问者模式的一个好例子:您希望根据参数的具体类型应用处理.
它允许将复制操作组合在一起,就像在实际代码中一样.
一般的copyObject()方法可以依赖于CopyVisitor,它将根据参数的具体类型进行复制:
@SuppressWarnings("unchecked")
static T copyObject(T payload) {
CopyVisitor visitor = new CopyVisitor();
payload.accept(visitor);
return (T) visitor.getCopy();
}
CopyVisitor实现了一个经典的Visitor接口:
public interface Visitor {
void visitHuman(Human human);
void visitCar(Car car);
void visitPlanet(Planet planet);
}
通过这种方式 :
public class CopyVisitor implements Visitor {
private Visited copy;
@Override
public void visitHuman(Human human) {
copy = Human.builder()
.name(human.getName())
.age(human.getAge())
.build();
}
@Override
public void visitCar(Car car) {
copy = Car.builder()
.model(car.getModel())
.brand(car.getBrand())
.build();
}
@Override
public void visitPlanet(Planet planet) {
//...
}
public Visited getCopy() {
return copy;
}
}
被访问的类(Car,Human,Plan)将实现一个特定的接口来“接受”访问者:
public interface Visited {
void accept(Visitor visitor);
}
如 :
public class Human implements Visited {
@Override
public void accept(Visitor visitor) {
visitor.visitHuman(this);
}
}
所以你可以用这种方式使用copy()方法:
Human human = new Human();
// set some fields ...
Human copiedHuman = copyObject(human); // compile
Car copiedCar = copyObject(human); // doesn't compile
标签:java,java-8,object,copy
来源: https://codeday.me/bug/20190727/1549494.html