1、clone方法的通用约定是非常弱的
x.clone()!=x
x.clone().getClass()==x.getClass()
x.clone().equals(x)
都不是绝对的要求
2、Clone方法就是另一个构造器,你必须保证它不会伤害到原始的对象,并确保正确地创建被克隆对象中的约束条件。
3、clone架构与应用可变对象的final域的正常用法是不兼容的。
4、深度clone,典型例子HashTable
5、线程安全的类实现Cloneable接口,clone方法必须实现好同步:HashTable。
public class DeepClone {
public static void main(String[] arr){
Hashtable<String, Integer> table=new Hashtable<String, Integer>();
table.put("MM", 100);
Hashtable<String, Integer> copytable=(Hashtable) table.clone();
System.out.println("----------mm----------"+copytable.get("MM"));
}
}
总结:
(1)默认实现方式
实现了Cloneable接口的类都应该有一个公用的方法覆盖clone:
@Override public PhoneNumber clone() {
super.clone();
}
此公有方法首先调用super.clone(),然后修正任何需要修正的域(浅克隆、深度克隆)。
(2)最佳实践
实现对象的拷贝的好办法是提供一个拷贝构造器(copy constructor)或者拷贝工厂(copy factory)
相比Cloneable/clone优点:
不依赖于某一种很有风险的,语言之外的对象创建机制;
不要求遵守尚未制定好的文档规范;
不会与final域的正常使用发生冲突;
不会抛出不必要的受检查异常CloneNotSupportedException;
不需要强制进行类型转换;
建议使用最佳实践
/**
* 拷贝构造器(copy constructor)或者拷贝工厂(copy factory)展示
* @author Administrator liuyang
* Dec 23, 2009-12:05:00 AM
*/
public class GoodClone {
private int type;
private final String special;
public GoodClone(int type, String spe) {
this.type = type;
this.special = spe;
}
/**
* 拷贝构造器
* @param good
*/
public GoodClone(GoodClone good) {
this.special = good.special;
this.type = good.type;
}
/**
* 拷贝工厂
* @param good
* @return
*/
public static GoodClone newInstance(GoodClone good) {
return new GoodClone(good.type, good.special);
}
public static GoodClone cloneInstance(GoodClone good) {
return new GoodClone(good.type, good.special);
}
public static void main(String[] arr) {
GoodClone entity = new GoodClone(10, "spacialGood");
GoodClone copyEd1 = GoodClone.newInstance(entity);
System.out.println("----------克隆方式newInstance-----------"
+ (entity == copyEd1));
GoodClone copyEd2 = new GoodClone(entity);
System.out.println("----------克隆方式2-----------" + (entity == copyEd2));
System.out.println("----------克隆方式1与克隆方式2-----------"
+ (copyEd1 == copyEd2));
}
}
分享到:
相关推荐
darts-clone-java 用Java编写的Double-ARray Trie System克隆。 该库基于称为“快速高效”库的 。入门设置要使用Maven添加依赖项,请使用以下命令: < dependency> < groupId>...
Java中的克隆(Clone)机制,很少涉及的内容。
语音克隆模型
git-fastclone, 关于类固醇,git clone 递归 fastclone git fastclone是类固醇的git clone --recursive 。为什么 fastclone?在特定机器上进行大量重复签出?知识库 1st Fastclone 2nd Fastc
gitim-用一个简单命令, clone 你的所有 github 仓库
gitlab 克隆 用于将整个 gitlab 结构轻松克隆到本地机器的工具。 自由软件:MIT 许可证 要求 要求 Python> = 3.6 安装 您可以通过安装“ gitlab-clone”: $ pip install gitlab-clone 用法 >>> gitlab - clone: ...
react-native-instagram-clone:instagram与世博会克隆
git-clone-repos 通过shell命令克隆多个git仓库 安装 npm i git-clone-repos 用法 const clone = require ( 'git-clone-repos' ) ; ( async ( ) => { await clone ( [ 'git@github....
克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理...
TikTok克隆TikTok应用程序布局的克隆。 | 开发中画面技术领域该项目是使用以下技术开发的:带和如何使用要克隆和运行此应用程序,您需要在计算机上安装 , 或更高版本+ 或更高版本+ 。 从您的命令行: # Clone this ...
android-java-organizze-clone
图像清晰化系列-图片克隆放大器clone v2.0免费版
对象克隆ES5的深克隆和比较概要// just for conveniencevar log = function ( ) { console . log . apply ( console , [ ] . slice . call ( arguments ) ) } ; var src = { name : 'dankogai' , lang : [ 'perl' ] ...
原创Matlab克隆优化函数-clone.m 这是一个克隆优化函数的程序,希望对大家有用
wx-java-miniapp 前言 本项目使用 对接微信小程序后台开发,基于SpringBoot构建,实现微信小程序后端开发功能,支持多个小程序。 更多信息请查阅: 技术栈 SpringBoot -> 环境搭建 MySQL -> 存储wx-miniapp配置信息...
Google-translate-clone:Google翻译克隆
twitter-clone, 一种基于 Ruby on Rails的Twitter 开源克隆 twitter克隆使用 Ruby on Rails http://twitter-clone-rails.herokuapp.com/的Twitter的开源克隆。正在启动git clone https://github.co
创建一个新的命令行终端窗口。 cd wallet-cli ./gradlew构建./gradlew运行-Pcmd 构建并运行网络钱包 cd wallet-cli ./gradlew编译cd编译cd库java -jar wallet-1.0-SNAPSHOT.jar wallet-cli如何连接至java-tron: ...
docker-git-clone:用于克隆请求的github或bitbucket存储库的Docker映像