![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective Java读书笔记
熹园
这个作者很懒,什么都没留下…
展开
-
第1条 创建和销毁对象——考虑用静态工厂方法代替构造器
创建类的实例时最常见的也是最简单的一个方法就是使用new,此外还可以使用静态工厂方法来封装实例的细节,控制实例的数量,减轻jvm的堆栈中的压力。1、静态工厂方法相比较于构造器的第一大优势是它们有名称,具有见名知意的优点,可以提高程序代码的可读性。当一个类需要多个带有相同签名的构造器时,我们应该优先考虑使用静态工厂方法来代替构造器,并且慎重地选择方法名称以便于突出它们之间的区别。eg:pub原创 2016-05-03 13:43:45 · 568 阅读 · 0 评论 -
第41条 方法——慎用重载
1、对象的运行时类型并不影响“哪个重载版本将被执行”,对于重载方法的选择是静态的(而对于被覆盖的方法的选择是动态的),要调用哪个重载方法是在编译时做出决定的。publicclass CollectionClassifier{ public static String classify(Set s){ return "Set";原创 2016-05-05 15:45:31 · 633 阅读 · 0 评论 -
第28条 泛型——利用有限制通配符来提升API的灵活性
转自:http://www.cnblogs.com/ttylinux/p/4439503.html 和的使用 1、的使用 如第25条所述,参数化类型是不可变的。换句话说,对于任何两个截然不同的类型Type1和Type2而言,List既不是List的字类型,也不是它的超类型。考虑第26条中的堆栈下面就是它的公共API:publi转载 2016-05-05 15:35:04 · 388 阅读 · 0 评论 -
第27条 泛型——优先考虑泛型方法
术语: 递归类型限制:通过某个包含该类型参数本身的表达式来限制类型参数。 考虑如下的方法,它的作用是返回两个集合的联合:[java] view plain copy// Users raw types - unaccepable! public static Set union(Set s1,转载 2016-05-05 15:06:42 · 2615 阅读 · 0 评论 -
第25条 泛型——列表优先于数组
数组与泛型相比有两个重要的不同点。 首先,数组是协变的。相反泛型则是不可变的。//这是被允许的Object[]objectArray = new Long[1];objectArray[0]= "hello world";//Throws java.lang.ArrayStoreException //Won'tcompile! 不被允许:Type mismat原创 2016-05-05 14:08:07 · 853 阅读 · 0 评论 -
第23条 泛型——请不要在新代码中使用原生态类型
1、泛型与原生态类型 声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。每个泛型都定义一个原生态类型,即不带任何实际类型参数的泛型名称。例如,List相对应的原生态类型是List。 2、请不要在新代码中使用原生态类型。虽然不提供类型参数,使用集合类型和其他泛型也仍然是合法的,但是这样就失掉了泛型在安全性(编译时检查)和表述性方面的所有优势。原创 2016-05-05 13:54:21 · 672 阅读 · 0 评论 -
第22条 类与接口——优先考虑静态成员类
嵌套类是指定义在另一个类内部的类,嵌套类只为它的外围类提供服务。嵌套类分为四种:静态成员类、非静态成员类、匿名类和局部类(后面三种称为内部类)。 如果一个嵌套类的实例可以在它外部类的实例之外独立存在,则这个嵌套类应该设置成静态成员类(即:如果你声明的成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中)。 匿名类的用法: 1、创原创 2016-05-04 16:18:43 · 575 阅读 · 0 评论 -
第18条 类与接口——接口优于抽象类
1、Java程序设计语言提供了接口和抽象类两种机制来定义允多个实现的类型。这两种机制的主要区别有:1)抽象类允许包含某些方法的实现,但是接口则不允许。2)为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。3)因为Java只允许单继承,所以抽象类作为类型定义受到了极大的限制,但是一个类可以实现多个接口。2、通过第16条中介绍的包装类模式,接口使得安全地增强类的功能成为可能。如果原创 2016-05-04 15:38:54 · 969 阅读 · 0 评论 -
第17条 类与接口——要么为继承而设计,并提供文档说明,要么就禁止继承
一个专门为了继承而设计并且具有良好文档说明的类,意味着: 1、该类的文档必须精确地描述了改写每一个方法所带来的影响。该类必须有文档说明其可改写的方法的自用性:对于每一个公有的或受保护的方法或者构造函数,它的文档必须指明它调用了哪些可改写的方法是以什么顺序调用,每个调用的结果是如何影响后续的处理过程的。惯例是如果一个方法调用了可改写的方法,那么在它的文档注释的末尾应该包含关于这些调原创 2016-05-04 15:18:43 · 798 阅读 · 0 评论 -
第13条 类与接口——使类和成员的可访问性最小化
要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。正确使用修饰符对于实现信息隐藏是非常关键的。 第一规则很简单:尽可能地使每个类或者成员不被外界访问。也就是说,我们应该使用与我们正在编写的软件功能相一致、尽可能最小的访问级别。 1、对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别,下面原创 2016-05-04 14:55:12 · 530 阅读 · 0 评论 -
第12条 对于所有对象都通用的方法——考虑实现Comparable接口
转自:http://www.cnblogs.com/gnuhpc/archive/2012/12/17/2822251.html1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)转载 2016-05-03 20:27:43 · 351 阅读 · 0 评论 -
第9条 对于所有对象都通用的方法——覆盖equals时总要覆盖HashCode
每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起运作,这样的集合包括HashMap、HashSet和HashTable。来自JavaSE6的约定如下: 1.在应用程序执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象多次原创 2016-05-03 15:59:26 · 333 阅读 · 0 评论 -
第8条 对于所有对象都通用的方法——覆盖equals时请遵守通用约定
==表示的是物理上的相等,equals()表示的是逻辑上的相等。因为每一个类的实例对象本质上都是唯一的,利用物理相等(==)是指一个实例只能等于它自身。利用逻辑相等(equals())是指一个实例是否与另一个实例的某些关键域相等,从而来判断这两个实例是否相等。Object类的equals()方法的实现:物理相等的话就逻辑相等。1、不需要覆盖Object类的equals方法情况1)希望这个类原创 2016-05-03 15:52:26 · 637 阅读 · 0 评论 -
第6条 创建和销毁对象——消除过期的对象引用
1、如果一个栈先是增长,然后再收缩,那么从栈中弹出来的对象将不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,它们也不会被回收。这是因为,栈内部维护着对这些对象的过期引用。所谓的过期引用是指永远不会被解除的引用。给出下面简单的栈的实现的例子:publicclass Statck{ private Object[] elements; private原创 2016-05-03 15:01:25 · 856 阅读 · 0 评论 -
第3条 创建与销毁对象——用私有构造器或者枚举类型强化Singleton属性
修改自http://blog.sina.com.cn/s/blog_44163be90100q0zd.html实现Singleton有以下三种方法。1、将公有静态成员做成final域:public class Elvis { public static final Elvis INSTANCE = newElvis(); private Elvis() { }转载 2016-05-03 14:25:33 · 463 阅读 · 0 评论 -
第2条 创建和销毁对象——遇到多个构造器参数时要考虑用构建器
1、静态工厂与构造器有一个共同的局限性:它们都不能很好地扩展到大量的参数。当创建对象需要传入多个参数的时候,程序员一向习惯采用重叠构造器模式来解决,也就是根据参数的数量写不同的构造器,示例如下:public class A{ public A(int a){} public A(int a, int b){} public A(int a, int b, int c){}}虽然原创 2016-05-03 13:51:55 · 362 阅读 · 0 评论 -
第45条 通用程序设计——将局部变量的作用于最小化
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。 1、最强有力的做法就是在第一次使用变量的地方对其进行声明。 在循环中提供了特殊的机会来将变量的作用域最小化。对于for循环,允许声明循环变量,且它们的作用域被限定在正好需要的范围之内。因此,如果在循环终止之后不再需要循环变量的内容,for循环就优先于while循环。示例1:原创 2016-05-05 15:53:01 · 582 阅读 · 0 评论