java 不同对象复制_java – 创建一个复制不同对象的泛型函数

所以我有一个用例,我需要复制类的对象(类可能会有所不同,具体取决于工厂的输入类型.

这是我想要做的样本

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值