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


每一条警告都表示可能在运行时抛出ClassCastException异常 。要尽最大的努力去消除这些警告 。如果无法消除但是可以证明引起警告的代码是安全的,就可以在尽可能小的范围中,使用@SuppressWarnings("unchecked")注解来禁止警告,但是要把禁止的原因记录下来 。
参数化类型不支持协变的,即对于任何两个不同的类型Type1和Type2而言,List既不是List的子类型 , 也不是它的超类 。为了解决这个问题,提高灵活性,Java提供了一种特殊的参数化类型,称作有限制的通配符类型,即List? extends E和List? super E 。使用原则是producer-extends,consumer-super(PECS) 。如果即是生产者,又是消费者,就没有必要使用通配符了 。
还有一种特殊的无限制通配符List?,表示某种类型但不确定 。常用作泛型的引用,不可向其添加除Null以外的任何对象 。
嵌套类(nested class)是指定义在另一个类的内部的类 。嵌套类存在的目的只是为了它的外部类提供服务,如果其他的环境也会用到的话 , 应该成为一个顶层类(top-level class) 。嵌套类有四种:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous class)和 局部类(local class) 。除了第一种之外 , 其他三种都称为内部类(inner class) 。
总而言之,这四种嵌套类都有自己的用途 。假设这个嵌套类属于一个方法的内部,如果只需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就要把它做成匿名类 。如果一个嵌套类需要在单个方法之外仍然可见,或者它太长了,不适合放在方法内部,就应该使用成员类 。如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的,否则就做成静态的 。
通过对常见场景的代码逻辑进行抽象封装,形成相应的模板工具类,可以大大减少重复代码,专注于业务逻辑 , 提高代码质量 。
面向对象编程相对于面向过程,多了实例化这一步,而对象的创建必须要指定具体类型 。我们常见的做法是“哪里用到 , 就在哪里创建” , 使用实例和创建实例的是同一段代码 。这似乎使代码更具有可读性,但是某些情况下造成了不必要的耦合 。
对于顶层的(非嵌套的)类和接口,只有两种的访问级别:包级私有的(没有public修饰)和公有的(public修饰) 。
对于成员(实例/域、方法、嵌套类和嵌套接口)由四种的访问级别,可访问性如下递增:
正确地使用这些修饰符对于实现信息隐藏是非常关键的 , 原则就是:尽可能地使每个类和成员不被外界访问(私有或包级私有) 。这样好处就是在以后的发行版本中,可以对它进行修改、替换或者删除 , 而无须担心会影响现有的客户端程序 。
不可变类是指其实例不能被修改的类 。每个实例中包含的所有信息都必须在创建该实例时提供,并在对象的整个生命周期内固定不变 。不可变类好处就是简单易用、线程安全、可自由共享而不容易出错 。Java平台类库中包含许多不可变的类,比如String、基本类型包装类、BigDecimal等 。
为了使类成为不可变,要遵循下面五条规则:
可变性最小化的一些建议:
TDD的最终目标是整洁可用的代码(clean code that works) 。大多数的开发者大部分时间无法得到整洁可用的代码 。办法是分而治之 。首先解决目标中的“可用”问题,然后再解决“代码的整洁”问题 。这与体系结构驱动(architecture-driven)的开发相反 。
采用TDD另一个好处就是让我们拥有一套伴随代码产生的详尽的自动化测试集 。将来无论出于任何原因(需求、重构、性能改进)需要对代码进行维护时,在这套测试集的驱动下工作,我们代码将会一直是健壮的 。

推荐阅读