- 浏览: 26153 次
- 性别:
- 来自: 武汉
最新评论
-
裴小星:
这种写法理解起来很费劲。我觉得还是直观感受比较重要。
里氏代换原则(Liskov Substitution Principle) -
mabusyao:
奇怪,代码引用在评论里面好像是失效的,我试试
public c ...
里氏代换原则(Liskov Substitution Principle) -
mabusyao:
有两个原则和里氏替换原则关系非常紧密。1. 开闭原则2. 依赖 ...
里氏代换原则(Liskov Substitution Principle)
第19条 --- 用类代替结构
JAVA刚面世的时候,很多C程序员都认为用类来代替结构现在太复杂,代价太大了,但是实际上,如果一个JAVA的类退化到只包含一个数据域的话,这样的类与C语言的结构大致是等价的。
比方说下面两个程序片段:
class Point { private float x; private float y; } class Point { private float x; private float y; }
实际上这段代码和C语言的结构基本上没什么区别,但是这段代码恐怕是众多OO设计Fans所不齿的,因为它没有体现封装的优异性,没有体现面向对象设计的 优点,当一个域被修改的时候,你不可能再采取任何辅助的措施了,那我们再来看一看采用包含私有域和共有访问方法的OO设计代码段:
class Point { private float x; private float y; public Point(float x,float y) { this.x=x; this.y=y; } public float getX(){retrun x;} public float getY(){return y;} public void setX(float x){this.x=x;} public void setY(float y){this.y=y;} } class Point { private float x; private float y; public Point(float x,float y) { this.x=x; this.y=y; } public float getX(){retrun x;} public float getY(){return y;} public void setX(float x){this.x=x;} public void setY(float y){this.y=y;} }
单从表面上看,这段代码比上面那个多了很多行,还多了很多函数,但是仔细想一下,这样的OO设计,似乎更人性化,我们可以方面的对值域进行提取,修改等操 作,而不直接和值域发生关系,这样的代码不仅让人容易读懂,而且很安全,还吸取了面向对象程序设计的灵活性,试想一下,如果一个共有类暴露它的值域,那么 想要在将来的版本中进行修改是impossible的,因为共有类的客户代码已经遍布各处了。
需要提醒一点的是,如果一个类是包级私有的,或者是一个私有的嵌套类,则直接暴露其值域并无不妥之处。
第20条 --- 用类层次来代替联合
我们在用C语言来进行开发的时候,经常会用到联合这个概念,比如:
typedef struct{ double length; double width; }rectangleDimensions_t;
那我们在JAVA里面没有联合这个概念,那我们用什么呢?对!用继承,这也是JAVA最吸引我的地方之一,它可以使用更好的机制来定义耽搁数据类型,在 Bruce Eckel的Thinking in java里面也多次提到了一个和形状有关的例子,我们可以先笼统的定义一个抽象类,即我们通常所指的超类,每个操作定义一个抽象的方法,其行为取决于标签 的值,如果还有其他的操作不依赖于标签的值,则把操作变成根类(继承的类)中的具体方法。
这样做的最重要的优点是:类层次提供了类型的安全性。
其次代码非常明了,这也是OO设计的优点。
而且它很容易扩展,即使是面向多个方面的工作,能够同样胜任。
最后它可以反映这些类型之间本质上的层次关系,从而允许更强的灵活性,以便编译时类型检查。
第21条 --- 用类来代替enum结构
Java程序设计语言提出了类型安全枚举的模式来替代enum结构,它的基本思想很简单:定义一个类来代表枚举类型的单个元素,并且不提供任何公有的构造函数,相反,提供公有静态final类,使枚举类型中的每一个常量都对应一个域。
类型安全枚举类型的一个缺点是,装载枚举类的和构造常量对象时,需要一定的时间和空间开销,除非是在资源很受限制的设备比如蜂窝电哈和烤面包机上,否则在实际中这个问题不会被考虑。
总之,类型安全枚举类型明显优于int类型,除非实在一个枚举类型主要被用做一个集合元素,或者主要用在一个资源非常不受限的环境下,否则类型安全枚举类型的缺点都不成问题,依次,在要求使用一个枚举类型的环境下,我们首先应考虑类型安全枚举类型模式。
第22条 --- 用类和接口来代替函数指针
众所周知,JAVA语言和C的最大区别在于,前者去掉了指针,小生第一次接触JAVA的时候觉得好不习惯,因为突然一下子没了指针,觉得好不方面啊,C语 言的精髓在于其指针的运用,而JAVA却把它砍掉了,让人好生郁闷,不过随着时间的推移,我渐渐明白了用类和接口的应用也同样可以提供同样的功能,我们可 以直接定义一个这样一个类,他的方法是执行其他方法上的操作,如果一个类仅仅是导出这样一个方法,那么它实际上就是一个指向该方法的指针,举个例子:
class StringLengthComprator{ public int compare(String s1,String s2) { return s1.length()-s2.length(); } }
这个类导出一个带两个字符串的方法,它是一个用于字符串比较的具体策略。它是无状态的,没有域,所以,这个类的所有实例在功能上都是等价的,可以节省不必 要的对象创建开销。但是我们不好直接把这个类传递给可户使用,因为可户无法传递任何其他的比较策略。相反,我们可以定义一个接口,即我们在设计具体策略类 的时候还需要定义一个策略接口:
public interface Comparator{ public int compare(Object o1,Object o2); }
我们完全可以依照自己的需要来定义它。
具体的策略类往往使用匿名类声明。
在JAVA中,我们为了实现指针的模式,声明一个接口来表示该策略,并且为每个具体策略声明一个实现了该接口的类,如果一个具体策略只被使用一次的话,那么通常使用匿名类来声明和实例化这个具体策略类,如果一个策略类反复使用,那么它的类通常是一个私有的的静态成员类。
转载请标明出处:http://blog.csdn.net/ilibaba/archive/2009/02/06/3866657.aspx
发表评论
-
Effective Java 学习笔记第25条 --- 谨慎设计方法的原型
2011-04-25 10:20 776谨慎选择方法的名字 选择易于理解的,并且与同一个包中的 ... -
Effective Java 学习笔记第24条 --- 需要时使用保护性拷贝
2011-04-25 09:53 967假设类的使用者会尽一切手段来破坏这个类的约束条件,在这样的前提 ... -
Effective Java 学习笔记第23条 --- 检查参数的有效性
2011-04-25 09:43 794非公有的方法我们应该用断言的方法来检查它的参数,而不是使用通常 ... -
Effective Java 学习笔记第17条 --- 优先考虑静态成员类
2011-04-25 09:30 755嵌套类只为它的外围类提供服务。嵌套类分为四种:静态成员类、非静 ... -
Effective Java 学习笔记第16条 --- 接口只是被用于定义类型
2011-04-22 08:55 746接口只是用来定义一个类型,不要把接口用来做其他的事情(如在接口 ... -
Effective Java 学习笔记第15条 --- 接口优于抽象类
2011-04-22 08:54 845接口和抽象类的区别: 抽象类允许包含默写方法的实现,而接口 ... -
Effective Java 学习笔记第15条 --- 要么专门为继承而设计,并给出文档说明,要么禁止继承
2011-04-22 08:52 832对并没有文档说明的类进行继承是非常危险的,它的公有方法有可能被 ... -
Effective Java 学习笔记第14条 --- 复合优先于继承
2011-04-22 08:50 862实现代码重用最重要的办法就是继承,但是继承破坏了封装,导 ... -
Effective Java 学习笔记第13条 --- 支持非可变性
2011-04-22 08:48 766为了使一个类成为非可变类,要遵循下面五条规则: 不要提供任 ... -
Effective Java 学习笔记第12条 --- 使类和成员的可访问能力最小化
2011-04-22 08:43 701好的模块设计应该尽最大可能封装好自己的内部信息,这样可以把模块 ... -
Effective Java 学习笔记第11条 --- 考虑实现Comparable接口
2011-04-22 08:31 707compareTo方法是java.lang.Comparabl ... -
Effective Java 学习笔记第10条 --- 谨慎地改写clone
2011-04-21 12:16 1055一个对象要想被Clone, ... -
Effective Java 学习笔记第9条 --- 总是要改写toString()方法
2011-04-21 11:59 872在Object的toString方法返回的形式是Class的类 ... -
Effective Java 学习笔记第8条 --- 改写equals方法时必须覆盖hashCode方法
2011-04-21 11:58 1000这点必须切忌,不然在你和hash-based集合打交道的时候, ... -
Effective Java 学习笔记第7条 --- 在改写equals方法时请遵守通用约定
2011-04-21 11:53 861下列情况是不需要改写equals方法的: 同一个类的不 ... -
Effective Java 学习笔记第6条 --- 避免使用终结函数
2011-04-20 11:53 1164终结函数(finalizer)可以用来回收不可到达的对象,就是 ... -
Effective Java 学习笔记第5条 --- 消除过期的对象引用
2011-04-20 11:49 777垃圾回收器不会对“过期引用”(永远不会在被解除的引用 ... -
Effective Java 学习笔记第4条 --- 避免创建重复的对象
2011-04-20 11:39 743如果一个对象是非可变的,那么它在程序中上可以被重用的,如: ... -
Effective Java 学习笔记第3条 --- 通过私有的构造函数强化不可实例化的能力
2011-04-20 11:35 834在面向对象程序设计中,假如存在太多只有静态属性 ... -
Effective Java 学习笔记第2条 --- 试用私有构造函数强化singleton属性
2011-04-20 11:30 610实现singleton的方法有两种: 方法一:公 ...
相关推荐
Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展可追溯到1991年,当时由...
《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...
标题“effective-java.pdf”与描述“effective-java.pdf”表明本文档是关于Java编程实践的指南,且内容可能来自于一本名为《Effective Java》的书籍,该书是由Joshua Bloch编写,被广泛认为是Java编程的权威指南。...
记录了我的effective-Python学习笔记,精简了effective-Python中重要的部分。effective-Python是一本值得多看几遍的书,但是看后面的几遍的时候完全可以直接看自己的学习笔记。此学习笔记侧重与比较实用的部分即前四...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,该书的第三版继续提供了关于如何编写高效、优雅、可维护的Java代码的指导。以下是基于给出的目录和部分内容提取的一些关键知识点: ### 第一...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。这本书分为多个条目,每个条目都深入探讨了一个特定的Java编程实践...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,第二版发布于2008年。这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. *...
《Effective C++》是一本由Scott Meyers所著的关于C++编程的书籍,该书广泛被认为是对C++程序员提高编程水平和解决实际问题提供了极好的指导。从给出的部分内容来看,读书笔记主要聚焦于以下几个知识点: 1. C++...
### Effective Robotics Programming with ROS —— 中文学习笔记 #### 知识点一:ROS环境配置与准备工作 **1.1 安装ROS Indigo** 在开始深入学习《Effective Robotics Programming with ROS》之前,首先需要搭建...
《Effective Java》是Java开发领域的一本经典著作,由Joshua Bloch撰写,书中提出了一系列编程最佳实践和设计模式,帮助开发者写出更高效、更可靠、更易于维护的Java代码。配套代码`effective-java-examples-master`...
Effective Java 3 学习记录 本学习记录主要介绍了 Effective Java 3 中的静态工厂方法和 Builder 模式两部分内容。 一、静态工厂方法 静态工厂方法是指返回类实例的命名规则,例如:from、of、valueOf、instance ...
Effective Java 读书笔记 - 枚举与注解 本文总结了Effective Java 中关于枚举与注解的知识点,涵盖了枚举类型的优点、使用指南、避免使用 int 常量、使用 EnumSet 和 EnumMap 等。 枚举类型的优点 枚举类型提供了...
《Effective Enterprise Java》是Java开发领域的一本经典著作,由著名技术专家Bill Venners编著,被广大Java开发者誉为“四大名著”之一。这本书深入探讨了在企业级Java开发中如何写出高效、可维护和易于理解的代码...
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...
【Java入门级学习笔记】 Java是一种广泛使用的编程语言,尤其对于初学者来说,它具有简单性、面向对象、健壮性、安全性等显著特点。本笔记将深入浅出地介绍Java的学习路径,涵盖从环境配置到核心概念的全方位理解。...
在编程领域,特别是Java开发中,"Effective Java"是一本非常经典的书籍,由Joshua Bloch撰写,书中提出了一系列最佳实践和设计原则,以帮助开发者编写出更高效、更安全的代码。根据提供的标题和描述,我们将探讨三个...
Effective Objective-C是本学习Objective-C的好书,没有见pdf版,亚马逊上的这儿本书的价格不菲。让我们来看看书里的内容和完整的学习笔记吧。