`
bingooh
  • 浏览: 53286 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

3.10-3.11 toString()、clone()

 
阅读更多

总是覆盖toString()以返回用户可读的信息,注意的地方:

1.提供getter方法以单独获取toString()返回的数据,避免使用者解析toString()以获取数据

 

2.如果toString()返回的格式化的字符串,那么需提供注释说明,同时提供静态格式化方法

 

clone方法容易导致错误,一般不建议使用此方法,而是提供相应的构造函数或者静态工厂方法用于对象复制

 

Object的clone()是protected,并且直接抛出CloneNotSupportedException。子类如果要覆盖clone(),必须声明实现Cloneable接口。如果类声明实现Cloneable接口,那么调用此类的对象的clone()不会抛出异常

 

一般覆盖clone()代码如下:

	@Override
	//声明为public,不抛出异常,返回具体类型的对象
	 public PhoneNumber clone(){
		try{
			//必须调用super.clone()获取被复制的对象
			PhoneNumber result=(PhoneNumber)super.clone();
			
			//此处可以设置被复制的对象的具体属性值
			
			return result;
		}catch (CloneNotSupportedException e) {
			//因为类声明实现Cloneable接口,所以永远不会抛出此异常
			throw new AssertionError();
		}
	}

 

 

覆盖clone()需要注意的地方:

1.总是调用super.clone()获取被复制的对象

 

2.不要在clone()里调用构造函数(应调用super.clone()),复制对象时也不会调用任何构造函数

 

3.不要在clone()里调用非final的方法,以避免被复制的子类对象状态不正确(子类可能覆盖父类方法以设置自身的属性值)

 

4.如果类包含final属性,当其对象被clone时,此属性不会被设置(未测试)

 

5.如果被clone的对象包含非基本数据类型的属性,那么需要自行复制这些属性(deep copy)

 

6.在多线程环境,考虑使用synchronized声明clone()

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics