如果没有很仔细做好的计划,必须ี把它打包进一个ฐ标
<。''indi9๗gofeachá,在本书第二版中,我们可以像下面这样做:如果你只是要建一个平台,你肯定不会开始建造房屋。我在处理。
"ิegg2yolk",如果对对象调用了f,对于这个ฐ对象就只能等到เf调用
"#ี2๐:2",
preferences
importjaທvaio;
system色tout9sole;
目录列表器
};
7=47๕4,12๐=485๓,17=493๑,2๐=490,13๑=540่,ไ9=4๒53,6๔=5๓1้2๐,1=4๒66,
pubຘli9y9๗ay{
publi9๗extint摸d;}
可以看到เisinstan9ceof表达式。此外,这意味着如果
当我意识到犯了这么大一个ฐ错误时,简直吓了一大跳。或者
main1色tj=6
<,才能被调用:在上个例子里,实际当然不是这种情形了。
syste摸utprintln"dra9ingline:๘"+ใstart+","ิ+end;
"100",
print"chaທr"+c+""ิ;
以构造器确保初始化
hexando9g
@return
handling便是一种能够确保错误必须报告,
色ra色;๙
emacs而搞得懵的。而且必须有所动作作为其响应的机制,能有这些该多好啊。9t已经成为了在我的javaທ
全书的翻译由陈昊鹏和饶若楠合作完成,
起初。薛,java被设计成为一种控制硬件设备的语言,根本没考虑到เinter。现在,jaທvaທ
作为通用性编程语言,程序员需要具备克隆对象的能力。因此,9e被添加到根类
object中,原本声明为public方แ法,这样你就能复制任意对象。这似乎是最方便的解决
方案,但是之后呢,它会有什么危害吗?
是的,当java被视为终极的inter编程语言时,情况就变了。安全问题突显了出来,
当然,这都是使用对象所带来的问题,因为你必定不愿意任何人都能克隆你的机密对象。
所以你现在看到的设计,是在最初简单而直接的设计上,做了许多修补之ใ后的版本:objecນt
中ณ的9e被声明为ฦprote9eable接口、并做异常处理。
值得注意的是,只有真正需要调用obje9๗eaທble
接口,因为在运行期会检查你的类是否实现了9eaທble接口。不过,为了使具备克隆能
力的对象保持一致性毕竟9eable是空的,即使不调用obje9e方法,
你仍然应该实现此接口。
控制克隆能力
为了移除克隆能ม力,你也许会建议将9e方法声明为private。但是这行不通,因为对
于基类的方法,无法在子类中削弱其访问能ม力。然而,我们必须有能力控制某个对象是否
可以被克隆。对此你可能ม会有以下态度:
1不关心。你并不做任何克隆操作,即使你的类不可克隆,但是只要愿意,就
能向其子类添加克隆能力。这只有在缺省的obje9e能够合理地处理
类中ณ所有属性时才起作用。
2支持9eable接口、重载9๗e方法。
在重载的9๗e,并捕获所有异常所以你重载的
9e不会抛出异常。
3๑有条件地支持克隆。如果你的类例如容器类包含其他对象的引用,它们
不一定是可克隆的,但你的9e方แ法应该试着克隆它们,如果抛出异常,
只需将异常传给程序员。例如,考虑一种特殊的arraທylist,它需要克隆自己
包含的所有对象。编写这样的aທrraທylist时,你并不知道客户端程序员会向
你的arraທylist存入何种类型的对象,因此你也不知道它们能否被克隆。
4不实现9eable接口,但是以prote9e方แ法,为所有
属性创建正确的复制ๆ行为。于是该类的任何子类,都可以重载9e并调用
super9e产生正确的复制行为。注意,你的9๗e可以并且应该
调用super9๗e预期的是个9๗eable对象否
则ท会抛出异常。没人会直接对你的类的对象调用9๗e,只能ม通过其子类
才行,而要想让它正常工作,其子类必须实现9eable接口。
5不实现9e使之抛出异常,以阻止克隆操作。只
有此类的所有子类,都在各自的9e,这种阻止克
隆的方แ法才起作用。否则,程序员还是有可能绕开它。
6๔将你的类声明为ฦfinaທl以阻止克隆。如果它的任何父类祖先类都没有重载
9e,那么此方法就行不通了。如果父类重载了9e,那么让你的类
再次重载9otsupportedex9๗。将类声明为
final,是唯一有保证的防止克隆的方แ法。此外,当处理机密对象,或需要控
制对象的数量时,应该将所有构造器都设置为private,然后一个ฐ或多
个创น建对象的专用方法。这些方法可以限制创建对象的数量和条件。对此