第4章 类和接口
2015-09-11 20:54
253 查看
第13条:使类和成员的可访问性最小化
第14条:在公有类中使用访问方法而非公有域
毫无疑问,说到公有类的时候,坚持面向对象程序设计思想的看法是正确的:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改变该类的内部表示法的灵活性。如果公有类暴露了它的数据域,要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各处了。
第15条:使可变性最小化
为了使类成为不可变,要遵循下面五条规则:1.不要提供任何会修改对象状态的方法。
2.保证类不会被扩展
3.使所有的域都是final的
4.使所有的域都成为私有的
5.确保对于任何可变组件的互斥访问
不可变对象本质上是线程安全的,它们不要求同步。
不可变对象为其他对象提供了大量的构件,无论是可变的还是不可变的对象。
不可变类真正唯一的缺点是,对于每个不同的值都需要一个单独的对象。
第16条:复合优先于继承
继承是实现代码重用的有力手段但它并非永远是完成这项工作的最佳工具。使用不当会导致软件变得很脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处于同一个程序员的控制之下。对于专门为了继承而设计、并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而,
对普通的具体类进行跨越包边界的继承,则是非常危险的。
有一种办法可以避免前面提到的所有问题。不用扩展现有的类,而是在新的类中增加一个私有域,它引用现有类的一个实例。这种设计被称为“复合”,因为
现有的类变成了新类的一个组件。这被称为转发,新类中的方法被称为转发方法。这样得到的类将会非常稳固,它不依赖于现有类的实现细节。即使现有的
类添加了新的方法,也不会影响新的类。
第17条:要么为继承而设计,并提供文档说明,要么就禁止继承
第18条:接口优于抽象类
Java程序设计语言提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。这两种机制之间最明显的区别在于,抽象类允许包含某些方法的实现,但是接口则不允许。一个更为重要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。任何一个类,只要它定义了所有
必要的方法,并且遵守通用约定,它就被允许实现一个接口,而不管这个类是处于类层次的哪个位置。因为Java只允许单继承,所以,抽象类作为类型
定义受到了极大的限制。
现有的类可以很容易被更新,以实现新的接口。
接口是定义mixin(混合类型)的理想选择。
接口运行我们构造非层次结构的类型框架。
第19条:接口只用于定义类型
当类实现接口时,接口就充当可以引用这个类的实例的类型(type)。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作。为了任何其他目的而定义接口是不恰当的。
有一种接口被称为常量接口,它不满足上面的条件。这种接口没有包含任何方法,它只包含静态的final域,每个域都导出一个常量。使用这些常量的类
实现这个接口,以避免用类来修饰常量名。
常量接口模式是对接口的不良使用。
第20条:类层次优于标签类
第21条:用函数对象表示策略
Java没有提供函数指针,但是可以用对象引用实现同样的功能。调用对象上的方法通常是执行该对象上的某项操作。然而,我们也可能定义这样一种对象,它的方法执行其他对象上的操作。如果一个类仅仅导出这样的一个方法,它的实例实际上就等同于一个指向该方法的指针。这样的实例被称为函数对象。
第22条:优先考虑静态成员类
潜逃类是指被定义在另一个类的内部的类。嵌套类存在的目的应该只是为它的外围类提供服务。如果嵌套类将来可能会用于其他的某个环境中,它就应该是顶层类。嵌套类有四种:静态成员类。非静态成员类、匿名类和局部类。除了第一种之外,其他三种都被称为内部类。
静态成员类是最简单的一种嵌套类。最好把它看作是普通的类,只是碰巧被声明在另一个类的内部而已,它可以访问外围类的所有成员,包括那些声明为
私有的成员。静态成员类是外围类的一个静态成员,与其他的静态成员一样,也遵守同样的可访问性规则。如果它被声明为私有的,它就只能在外围类的内部
才可以被访问,等等。
静态成员类的一种常见用法是作为公有的辅助类,仅当与它的外部类一起使用时才有意义、
从语法上讲,静态成员类和非静态成员类之间唯一的区别是,静态成员类的声明中包含修饰符static。尽管它们的语法非常相似,但是这两种嵌套类有很大
的不同。非静态成员类的每个实例都隐含着与外围类的一个外围实例相关联。在非静态成员类的实例方法内部,可以调用外围实例上的方法,或者利用修饰过
的this构造获得外围实例的引用。如果嵌套类的实例可以在它外围类的实例之外独立存在,这个嵌套类就必须是静态成员类:在没有外围实例的情况下,
要想创建非静态成员 类的实例是不可能的。
相关文章推荐
- 二分查找
- 构建Hadoop metric
- windows Python 3.4.3 安装图文
- poj3274数位HASH
- Leet Code 12 & 13 Integer <---> Roman
- Redis学习6之redis多节点集群搭建和使用
- uva 11080 - Place the Guards(二分图染色)
- 主流数据技术--JSON数据解析--原生解析
- 在 Linux 中使用日志来排错
- 在触发思考
- ubuntu 14.04启动进入命令行界面
- Asp.net中GridView使用详解
- X64编程总结
- 【最小费用流】【模板】
- HDU 1241 【搜索 水】
- Java心得31
- 屏幕适配——Drawable 资源
- 你所不知道的__ block 内幕
- IOS视图之UI基础
- navigationBar设置透明