java代码重构和优化 java代码重构和优化的区别( 三 )


当使用一个方法返回的对象时,而这个对象可能为空 , 这个时候需要对这个对象进行操作前 , 需要进行判空,否则就会报空指针 。当这种判断频繁的出现在各处代码之中,就会影响代码的美观程度和可读性,甚至增加Bug的几率 。
空引用的问题在Java中无法避免,但可以通过代码编程技巧(引入空对象)来改善这一问题 。
根据单一职责原则,一个类应该有明确的责任边界 。但在实际工作中,类会不断的扩展 。当给某个类添加一项新责任时,你会觉得不值得分离出一个单独的类 。于是,随着责任不断增加,这个类包含了大量的数据和函数 , 逻辑复杂不易理解 。
此时你需要考虑将哪些部分分离到一个单独的类中,可以依据高内聚低耦合的原则 。如果某些数据和方法总是一起出现,或者某些数据经常同时变化 , 这就表明它们应该放到一个类中 。另一种信号是类的子类化方式:如果你发现子类化只影响类的部分特性,或者类的特性需要以不同方式来子类化,这就意味着你需要分解原来的类 。
继承使实现代码重用的有力手段,但这并非总是完成这项工作的最佳工具 , 使用不当会导致软件变得很脆弱 。与方法调用不同的是,继承打破了封装性 。子类依赖于其父类中特定功能的实现细节 , 如果父类的实现随着发行版本的不同而变化,子类可能会遭到破坏 , 即使他的代码完全没有改变 。
举例说明,假设有一个程序使用HashSet , 为了调优该程序的性能,需要统计HashSet自从它创建以来添加了多少个元素 。为了提供该功能,我们编写一个HashSet的变体 。
通过在新的类中增加一个私有域,它引用现有类的一个实例 , 这种设计被称为组合,因为现有的类变成了新类的一个组件 。这样得到的类将会非常稳固,它不依赖现有类的实现细节 。即使现有的类添加了新的方法,也不会影响新的类 。许多设计模式使用就是这种套路 , 比如代理模式、装饰者模式
继承与组合如何取舍
Java提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类 。自从Java8为接口增加缺省方法(default method),这两种机制都允许为实例方法提供实现 。主要区别在于,为了实现由抽象类定义的类型,类必须称为抽象类的一个子类 。因为Java只允许单继承,所以用抽象类作为类型定义受到了限制 。
接口相比于抽象类的优势:
接口虽然提供了缺省方法,但接口仍有有以下局限性:
接口缺省方法的设计目的和优势在于:
为了接口的演化
可以减少第三方工具类的创建
可以避免创建基类
由于接口的局限性和设计目的的不同,接口并不能完全替换抽象类 。但是通过对接口提供一个抽象的骨架实现类 , 可以把接口和抽象类的优点结合起来 。接口负责定义类型,或许还提供一些缺省方法 , 而骨架实现类则负责实现除基本类型接口方法之外 , 剩下的非基本类型接口方法 。扩展骨架实现占了实现接口之外的大部分工作 。这就是模板方法(Template Method)设计模式 。
Image [5].png
接口Protocol:定义了RPC协议层两个主要的方法,export暴露服务和refer引用服务
抽象类AbstractProtocol:封装了暴露服务之后的Exporter和引用服务之后的Invoker实例,并实现了服务销毁的逻辑
具体实现类XxxProtocol:实现export暴露服务和refer引用服务具体逻辑
由于为了保持Java代码的兼容性,支持和原生态类型转换,并使用擦除机制实现的泛型 。但是使用原生态类型就会失去泛型的优势,会受到编译器警告 。

推荐阅读