mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
add DefaultCloneable
This commit is contained in:
parent
9cac854b3c
commit
ff70f92e9c
@ -16,6 +16,7 @@
|
|||||||
* 【core 】 IdCardUtil.isValidCard不再自动trim(issue#I4I04O@Gitee)
|
* 【core 】 IdCardUtil.isValidCard不再自动trim(issue#I4I04O@Gitee)
|
||||||
* 【core 】 改进TextFinder,支持限制结束位置及反向查找模式
|
* 【core 】 改进TextFinder,支持限制结束位置及反向查找模式
|
||||||
* 【core 】 Opt增加部分方法(pr#459@Gitee)
|
* 【core 】 Opt增加部分方法(pr#459@Gitee)
|
||||||
|
* 【core 】 增加DefaultCloneable(pr#459@Gitee)
|
||||||
*
|
*
|
||||||
### 🐞Bug修复
|
### 🐞Bug修复
|
||||||
* 【core 】 修复FileResource构造fileName参数无效问题(issue#1942@Github)
|
* 【core 】 修复FileResource构造fileName参数无效问题(issue#1942@Github)
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
package cn.hutool.core.clone;
|
|
||||||
|
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
public interface DefaultClone extends java.lang.Cloneable {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 浅拷贝
|
|
||||||
* 功能与 {@link CloneSupport#clone()} 类似, 是一种接口版的实现
|
|
||||||
* 一个类,一般只能继承一个类,但是可以实现多个接口,所以该接口会有一定程度的灵活性
|
|
||||||
*
|
|
||||||
* @param <T> T
|
|
||||||
* @return obj
|
|
||||||
*/
|
|
||||||
@SuppressWarnings({"unchecked"})
|
|
||||||
default <T> T clone0() {
|
|
||||||
try {
|
|
||||||
final Class<Object> objectClass = Object.class;
|
|
||||||
final Method clone = objectClass.getDeclaredMethod("clone");
|
|
||||||
clone.setAccessible(true);
|
|
||||||
return (T) clone.invoke(this);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new CloneRuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
|||||||
|
package cn.hutool.core.clone;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ReflectUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 克隆默认实现接口,用于实现返回指定泛型类型的克隆方法
|
||||||
|
*
|
||||||
|
* @param <T> 泛型类型
|
||||||
|
* @since 5.7.17
|
||||||
|
*/
|
||||||
|
public interface DefaultCloneable<T> extends java.lang.Cloneable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 浅拷贝,提供默认的泛型返回值的clone方法。
|
||||||
|
*
|
||||||
|
* @return obj
|
||||||
|
*/
|
||||||
|
default T clone0() {
|
||||||
|
try {
|
||||||
|
return ReflectUtil.invoke(this, "clone");
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new CloneRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
|||||||
package cn.hutool.core.clone;
|
package cn.hutool.core.clone;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
@ -17,70 +19,29 @@ public class DefaultCloneTest {
|
|||||||
oldCar.setWheelList(Stream.of(new Wheel("h")).collect(Collectors.toList()));
|
oldCar.setWheelList(Stream.of(new Wheel("h")).collect(Collectors.toList()));
|
||||||
|
|
||||||
Car newCar = oldCar.clone0();
|
Car newCar = oldCar.clone0();
|
||||||
Assert.assertEquals(oldCar.getId(),newCar.getId());
|
Assert.assertEquals(oldCar.getId(), newCar.getId());
|
||||||
Assert.assertEquals(oldCar.getWheelList(),newCar.getWheelList());
|
Assert.assertEquals(oldCar.getWheelList(), newCar.getWheelList());
|
||||||
|
|
||||||
newCar.setId(2);
|
newCar.setId(2);
|
||||||
Assert.assertNotEquals(oldCar.getId(),newCar.getId());
|
Assert.assertNotEquals(oldCar.getId(), newCar.getId());
|
||||||
newCar.getWheelList().add(new Wheel("s"));
|
newCar.getWheelList().add(new Wheel("s"));
|
||||||
|
|
||||||
Assert.assertNotSame(oldCar, newCar);
|
Assert.assertNotSame(oldCar, newCar);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
@Data
|
||||||
|
static class Car implements DefaultCloneable<Car> {
|
||||||
class Car implements DefaultClone {
|
private Integer id;
|
||||||
private Integer id;
|
private List<Wheel> wheelList;
|
||||||
private List<Wheel> wheelList;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(Integer id) {
|
@Data
|
||||||
this.id = id;
|
@AllArgsConstructor
|
||||||
|
static class Wheel {
|
||||||
|
private String direction;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Wheel> getWheelList() {
|
|
||||||
return wheelList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setWheelList(List<Wheel> wheelList) {
|
|
||||||
this.wheelList = wheelList;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Car{" +
|
|
||||||
"id=" + id +
|
|
||||||
", wheelList=" + wheelList +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class Wheel {
|
|
||||||
private String direction;
|
|
||||||
|
|
||||||
public Wheel(String direction) {
|
|
||||||
this.direction = direction;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDirection() {
|
|
||||||
return direction;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDirection(String direction) {
|
|
||||||
this.direction = direction;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Wheel{" +
|
|
||||||
"direction='" + direction + '\'' +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user