




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章面向接口而非实现进行编程,6,第六章,API是文档的说明和接口的说明总称。通常类的组成是包括公开和非公开的成员两部分。上一章说到:API公开的内容越少越好。将代码分成接口和实现两部分,在编写代码时,让系统的其它部分只依赖于接口这是我们呈现设计的习惯。接口是用来公开给使用只的说明部分,实现是类内部的具体实现过程。,方法添加容易与移去难设计者带来的问题往往远远多于其解决的问题。向API中添加一个新方法是很容易的一件事,但与此相反,想从API中移徐一个方法却非常困难。一个API对外提供的功能越多,那么为保持向后兼容性所做的工作也就越多。提供的功能越多留给具体实现的空间也就越少。如果API公开的不必要的内容越多,可改进的空间也就越少。,方法的添加与移去,1代码不是API:需要经过抽象的说明才是API,没有经过重构,那么公开的很可能不是API,而是内部的具体实现。千万不要把代码当成API,还要花精力来整理。2公布的是接口不是实现:给调用者是接口应用,不是公布类的具体实现描述。3逻辑分离与物理分离:只是把类说明,和类实现分离,但文件还是在以前。4物理分离:接口说明和实现说明分别在两个不同的文件中,达到物理的分离。,公布的是接口不是实现,编程应该面向接口而非现实:在使用API时,应该遵守正确的原则。不要依赖没说明的属性和文件资源:不要去依赖那些没有在文档中提起的属性和文件资源。提出合适API要求:正确的做事方法是向设计者要求提出合适API。那种自用示公开内容来完成某种功能的做法是非常脆弱的,会因为版本、环境的不同而无法正常运行。,编程应该面向接口而非现实,正确理解面向接口编程的概念,Iterface只是接口说明:能够清楚地理解面向接口编程并不是对应着Java中的Iterface,这种编程方式只是将其抽象定义与实际的实现这两类内容进行分离。类的使用特点:何时使用类接口使用特点:何时使用接口,6.1移除方法或者字段,不要随意移去方法和属性:(1)设计方法或属性在使用:(2)类会对相关的方法和属性设置访问权限。(3)类的成员被继承:,设计方法或属性在使用,从已经公开的类或者接口中移除方法或者字段是一件错误的事情。系统公开,可能说明给方法或属性具有一定使用代表性,这样就会有其他成员在使用。一个方法或者字段被定义为private或者是默认的package访问级别,那么对于外部代码来说,它是不可见的,也就无法进行访问。这种情况,从类中移除该内容,不会引起什么问题,但没什么意义。,类对相关方法和属性设置访问权限,类的设计者肯定会对类的成员根据实际使用需要设置成:PUBLIC,PROTECTED,PRIVATE等,如果你移去,就会造成该给访问的没办法访问,不能访问的有多此一举。,移去方法,对于源代码和二进制来讲,移除一个抽象的proteced方法是可以兼容的。从功能角度来说,可能是并不兼容。那个方法当时被动放到类中,应该是有本应的目的,而子类也可能是会重载该是方法,并希望在合适的时候被动调用。他们的实现就不能被调用了,theMethod方法语义也发生了改变,则子类是无法重载这个方法的。,6.2移除或者添加一个类或者接口,如果一个类或者接口可以被外部访问,就意味着其方法可能会被调用,或者其字段可能被引用,一旦类和接口成为API,两者就没什么区别了,都必须长久地存在下去。类和接口其实是没有很大区别,类强调封装性,接口强调调用方法或引用方法。,6.3向现有的继承体系中添加接口或者类,向现有的继承体系中添加类或者接口可以带来很多好处:(1)简化API:不必要公开那么多(2)引同更统一(3)维护更方便,例子说明,PublicabstractStringsayHello();PublicabstractStringsayHelloto(Stringwgo);作者希望可以简化这个APIPublicabstractclassSimpleHelloClassPublicabstractStringsayHello();当然,以前编写的类仍然需要维护。PublicabstractclasshelloClassextendsSimpleHelloClass简单只需要维护这里就可以,工厂方法支持参数化的返回类型(2),PublicfinalclassTemplateextendsobjectPrivatefinalClasstype;PublicTemplate(Classtypethis.type=type;PublicClassgetType()returntype;/nowwhat!?PublicTemplate()this(object.class);,工厂方法支持参数化的返回类型(3),PublicfinalclassTemplateextendsobjectPrivatefinalClasstype;PublicTemplate(Classtypethis.type=type;PublicClassgetType()returntype;DeprecatedSuppressWarnings(“unchecked”)PublicTemplate()this(Class)object.class);PublicstaticTemplatecreate()ReturnnewTemplate(object.class),5.3让所有的内容都不可更改,不考虑让其拥有子类,这个类不能被继承。否则API一旦发布以后,会有各种使用方式,大量无法预计的事情。PublicclassHelloPublicvoidhello()System.out.println(“Hello”);直接公开这个可被继承的Hello类,会有很多代码,是直接从外部调用Hello的Hello方法的:PublicstaticvoidsayHello()HelloHello=newHello();Hello.Hello();,各种使用方式,开发人员也可编写一个继承Hello的类MyHello,重载hello方法,代码如下。PrivatestaticclassMyHelloextendsHelloOverridePublicvoidhello()System.out.println(“Hi”);PrivatestaticclassSuperHelloextendsHelloOverridePublicvoidhello()Super.hello();System.out.println(“Helloonceagain”);,6.4添加方法或者字段(1),(1)尽量少用字段:应该避免在允许继承的类或者接口中添加新的抽象方法。如果是类,请确保该类不可被继承。(2)添加一个抽象方法可能不向后兼容:向类中添加一个抽象方法,则会强迫其非抽象的子类来实现该是抽象方法,这种改变是做不到向后兼容的。这种处理对于源代码来说是不兼容的。,6.4添加方法或者字段(2),(3)避免继承类添加新抽象方法:在对API进行改进时,与方法相比,字段受到的约束更多。这正是要避免在API中使用字段的原因;当然那种使用static和final声明的常用字段是可以添加到API中的。(4)不要在接口中添加一个非抽象方法:能添加抽象方法的只能是类,不可能在接口中添加一个非抽象方法。无论是向一个类还是一个接口中添加一个方法,只要这两者可以被继承,那么这种改变就做不到了百分百兼容。,6.5Java中接口和类的区别,多继承:Java接口最突出的特性就是多继承。因为多继承可以减少对内存的占用。利用多继承公使用一个对象,就可以实现API中公开的多个接口。类继承:类继承则只能有一个父类,此时如果类之间有些数据需要互访或者调用方法,那么只能用委托的方式。这样会占用很多空间,如果只是一两个,就不是那么明显了。性能方面的考虑就不是主要因素了。,6.6弱点背后的优点(1),向现有接口中添加方法总不太容易。要向后兼容的话,那么添加方法就不是有多困难的问题,而是几乎不可能完成的任务。(1)方法维护麻烦(2)引用麻烦(3)版本保持向后兼容麻烦那么就利用不祝来改变设计方法:采用多版本命名接口,保持系统兼容。对于语言的不同版本,要决定分别支持哪些功能。接口是一个非常合适的工具,6.6弱点背后的优点(2),PublicinterfaceInstanceProvidePublicClassinstanceClass()throwsexception;PublicObjectinstanceCreate()throwsException;把常用的专用到一个类中,提高整体运行效率。创建了如下这个接口:PublicinterfaceBetterInstanceProviderextendsInstanceProviderPublicBooleanisInstanceof(Classc);,6.6弱点背后的优点(3),If(instanceinstanceofBetterInstanceProvider)betterInstanceProviderbip=(BetterInsatnceProvider)instance;returnbip.isInstanceof(string.class);elseReturnstring.class.isAssignableFrom(instance.instanceClass();,6.7添加方法的另一种方案(1),禁止类被继承:利用final:把一个类声明为final,就表示这个类是不可被继承的。因此那种在接口或者抽象类中添加方法而引起的问题,对于这个final类来说就不会出现了。由于在类的二进制文件中,对于要调用的方法,是可以通过名称、参数及返回值来唯一确定的,所以不会产生兼容性的问题。不要定义具有相同数量参数同名方法:像theObject.add(null)这句代码,编译器就会给出一个编译错误,这这句代码中要方法具有二义性。要避免的方法很简单,就是不要加入具有相同数量的参数的同名方法。,6.7添加方法的另一种方案(2),Importjava.util.concurrent.Callable;PublicfinalclassInstanceProviderPrivatefinalCallableinstance;PublicInstanceProvider(Callableinstance)This.instance=instance;PublicClassinstanceClass()throwsExceptionReturninstance.call().getClass();PublicObjectinstanceCreate()throwsExceptionReturninstance.call();,6.7添加方法的另一种方案(3),PublicabstractclassAccessorPrivatestaticvolatileAccessorDEFAULT;PublicstaticAccessorgetDefauIt()Accessora=DEFAULT;If(a!=null)Returna;TryClass.forName(Item.class.getName(),Item,Item.class.getClassLoader();catch(Exceptionex)Ex.printStackTrace();ReturnDEFAULT;ReturnDEFAULT;,6.8抽象类有没有用呢,在一个API中,抽象类其实一直备受质疑,如果API中使用了抽象类,通常就会被动认为这是因为设计者没有投入足够的时间来合理地设计API。相对于Java接口,Java抽象类还有一些其他方面的优势,那就是抽象类可以包含static方法。,抽象类有没有用呢(2),PublicabstractclassInterfaceThatJustJoeCanImplementProtectedInterfaceThatJustJoeCanImplement()If(!”impl.joe.joesImpl”.equals(getClass().getName()ThrownewIllegalStateException(“Sorryyouarenotallowedtoimplementthisclass”);PublicabstractvoideveryoneCallThisJoeWillHandleTheRequest();,6.9要为增加参数做好准备(1),对API进行修改,那么最常见的问题就是如何通过添加方法的参数来增强现有方法的功能。PublicabstractclasscomputePublicabstractListgetData();PublicMapgetDataAndDescription()LinkedHashMapret=newLinkedHashMap();For(Strings:getData()Ret.put(s,s);Returnret;,6.9要为增加参数做好准备(2),对于客户来说,给他一个类去实现,就不如给他一个接口来实现,后者看起来更像是一种解决方案。同时在一个可以子类化的类中添加一个方法总是有些危险的。PublicinterfaceComputePublicvoidcomputeData(Requstrequest
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版司法局《移送执行申请书》民事类法律文书(空白模板)
- 临近地下室施工方案
- 深沟槽全是石方施工方案
- 咨询年度方案范文
- 轻质内外墙施工方案
- 寻宝记漫画营销推广方案
- 老旧建筑翻新加固方案设计
- 小型酒店客房营销方案
- 咨询目标与咨询方案
- 装修施工方案怎么编制的
- 2个商铺租赁合同范本
- 项目管理业务知识培训课件
- 2025年秋期新教科版6年级上册小学科学教学计划+进度表
- 1.1《土壤里面有什么》课件 2025-2026学年苏教版科学三年级上册
- 2025至2030中国仓库货架行业项目调研及市场前景预测评估报告
- 静脉留置针敷贴护理
- 小猪逛果园课件
- Unit 2 Home Sweet Home 单元全真模拟培优卷(含答案解析)八年级上册英语人教版
- 反邪教知识培训手册课件
- 建筑业企业资质标准
- 《法律英语(第4版)》全套教学课件
评论
0/150
提交评论