Effective java读书笔记
powerfuler
这个作者很懒,什么都没留下…
展开
-
effective java(2) 之遇到多个构造器参数时要考虑用构建器
effective java 之遇到多个构造器参数时要考虑用构建器一个类有多个参数,我们如何获得该类的对象?有三种解决方案可以处理这种问题。采用重叠构造器JavaBeans模式Builder模式1、重叠构造器重叠构造器:就是提供多个多个参数列表不同构造函数。一般我们遇到多个参数时候,就会考虑使用重叠构造器,第一个构造器是实例化对象必须的参数,第二个会多一原创 2017-09-22 23:19:27 · 272 阅读 · 0 评论 -
effective java(16) 之复合优先于继承
effective java 之复合优先于继承1、 继承是实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱。在包的内部使用继承是非常安全的,子类和超类的实现都处在同一个程序员的控制之下。对于专门为了继承而设计、并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而们对于进行跨越包边界的继承,则要非常小心。“继承”在这里特指一个原创 2017-10-18 21:27:26 · 359 阅读 · 1 评论 -
effective java(17) 之要么为继承而设计,并提供文档说明,要么就禁止继承
effective java 之要么为继承而设计,并提供文档说明,要么就禁止继承1、 对于专门为了继承而设计并且具有良好文档说明的类而言,该类的文档必须精确地描述覆盖每个方法所带来的影响。该类必须有文档说明它可覆盖的方法的自用性。对于每个公有的或受保护的方法或者构造器,它的文档必须指明该方法或者构造器调用了哪些可覆盖的方法,是以什么顺序调用的,每个调用的结果又是如何影响后续原创 2017-10-18 21:31:19 · 375 阅读 · 0 评论 -
effective java(18) 之接口优于抽象类
effective java 之接口优于抽象类1、Java程序设计语言提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。2、两种机制之间最明显的区别在:① 抽象类允许包含某个方法的实现,而接口则不允许。②为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。Java只允许单继承,所以,抽象类作为类型定义受到了极大限制。3、现在的类可以很容易的被更新原创 2017-10-18 21:35:24 · 701 阅读 · 0 评论 -
effective java(19) 之接口只用于定义类型
effective java 之接口只用于定义类型1、当类实现接口时,接口就充当可以引用这个类的实例类型。因此,类实现了接口,就表明客户端对这个类的实例可以实施某些动作。为了任何其他目的而定义的接口是不恰当的。2、常量接口是对接口的一种不良使用。类在内部使用某些常量,纯粹是实现细节,实现常量接口,会导致把这样的实现细节泄露到该类的导出API中,因为接口中所有的域都是及方原创 2017-10-18 21:39:00 · 377 阅读 · 0 评论 -
effective java(20) 之类层次优于标签类
effective java 之类层次优于标签类1、有时候,可能会遇到带有两种甚至更多钟风格的类的实例的类,并包含表示实例风格的(tag)域。例如下面这个类,它能够表示圆形或者矩形: //Tagged class - vastly inferior to a class hierarchy public class Figure1 { enum Shape { RE原创 2017-10-18 21:41:27 · 318 阅读 · 0 评论 -
effective java(21) 之用函数对象表示策略
effective java 之用函数对象表示策略1、有些语言支持函数指针(function pointer)、代理(delegate)、lambda表达式(lambda expression),或者支持类似的机制,允许程序把“调用特殊函数的能力”存储起来并传递这种能力。这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为。函数对象:调用操作符的类,其对象常称为函数原创 2017-10-18 21:45:03 · 400 阅读 · 0 评论 -
effective java(22) 之优先考虑静态成员类
effective java 之优先考虑静态成员类1、 嵌套类(nested class)是指被定义在另一个类的内部的类。嵌套类存在的目的应该是为它的外围类(enclosing class)提供服务。如果嵌套类将来可能会用于其他的某个环境中,它就应该是顶层类(top-level class)。嵌套类有四种:静态成员类(static member class)、非静态成员类(no原创 2017-10-18 21:51:20 · 461 阅读 · 0 评论 -
effective java(23) 之请不要在新代码中使用原生态类型
effective java 之请不要在新代码中使用原生态类型1、声明中具有一个或者多个类型参数(type parameter)的类或者接口,就是泛型。泛型类和泛型接口统称为泛型(generic type)。2、每种泛型定义一组参数化的类型,构成格式为:先是类或者接口的名称,接着用尖括号(3、原生态类型就像从类型声明中删除了所有的泛型信息一样。实际上,原生态类型原创 2017-10-28 22:51:32 · 331 阅读 · 0 评论 -
effective java(24) 之消除非受检警告
effective java 之消除非受检警告1、用泛型编程时,会遇到许多编译器警告:非受检强制转化警告(unchecked cast warning)、非受检方法调用警告、非受检普通数组创建警告、非受检转换警告。2、许多非受检警告很容易消除,如:Set s = new HashSet();编译器提醒你 HashSet is a raw type. Referen原创 2017-10-28 22:56:23 · 425 阅读 · 0 评论 -
effective java(25) 之列表优先于数组
effective java 之列表优先于数组1、协变的(convariant):表示如果Sub为super的子类型,那么数组类型Sub[]就是super[]的子类型。不可变的(invariant):对于任意两个不同的类型Type1和Type2,List既不是List的子类型,也不是List的超类型。不可具体化的(non-reifiable):指其运行时表示法包含的信息比它编译原创 2017-10-28 22:59:23 · 366 阅读 · 0 评论 -
effective java(26) 之优先考虑泛型
effective java 之优先考虑泛型1、Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。2、泛型在使用中还有一些规则和限制: 1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。 2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛原创 2017-10-28 23:03:18 · 398 阅读 · 0 评论 -
effective java(27) 之优先考虑泛型方法
effective java 之优先考虑泛型方法1、就如类可以从泛型中受益一般,方法也可以。静态工具方法尤其适合与泛型化。JDK中的Collections泛型中的所有“算法”方法都泛型化了。2、编写泛型方法与编写泛型类型类似。如:下面这个方法返回两个集合的联合。 public class testSet { public static Set union(S原创 2017-10-28 23:09:14 · 480 阅读 · 0 评论 -
effective java(15) 之使可变性最小化
effective java 之使可变性最小化1、不可变类是实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。例如String、BigInteger和BigDecimal类。不可变类更易于设计、实现和使用。2、设计不可变类的原则:1:不要提供任何修改对象状态的方法。(setter方法)2:保证类不会原创 2017-10-18 21:15:48 · 381 阅读 · 0 评论 -
effective java(14) 之在公有类中使用访问方法而非公有域
effective java 之在公有类中使用访问方法而非公有域1、如何理解这句话:我们不能这样做,Class Point {public double x;public double y;}Point类的数据域是可以直接被访问的,这样的类没有提供封装。如果不改变API,就无法改变它的数据表示法(比如,使用一个比double更高精度的类来表示x和y),也原创 2017-10-18 21:11:37 · 289 阅读 · 0 评论 -
effective java(3) 之用私有构造器或者枚举类型强化Singleton属性
effective java 之用私有构造器或者枚举类型强化Singleton属性实现单例模式通常有3种方法(详细请看设计模式单例模式一节)Singleton指仅仅被实例化一次的类。私有构造函数只能在函数内部调用,外部不能实例化,所以私有构造函数可以防止该类在外部被实例化。1.静态成员public class Aagersingleton {private static原创 2017-09-22 23:27:27 · 252 阅读 · 0 评论 -
effective java(4) 之通过私有构造器强化不可实例化的能力
effective java 之通过私有构造器强化不可实例化的能力1、在创建工具类的时候,大部分是无需实例化的,实例化对它们没有意义。在这种情况下,创建的类,要确保它是不可以实例化的。2、在创建不可实例化的类时,虽然没有定义构造器。客户端在使用该类的时候,依然可以实例化它。客户端,可以继承该类,通过实例化其子类来实现实例化;客户端可以调用默认的构造器来实例化该类。原创 2017-09-22 23:31:06 · 267 阅读 · 0 评论 -
effective java(5) 之避免创建不必要的对象
effective java 之避免创建不必要的对象1、对于对象一般来说,我们最好的做法是重用对象,而不是每次使用都new出一个新的相同功能的对象,这样做很高效,特别是对于那些不可变类来说。String s = "123";而不用String s = new String("123")因为JVM中会有一个常量池,可以保存字符串常量,直接使用"123"可以直接从常量池中返原创 2017-09-22 23:34:49 · 306 阅读 · 0 评论 -
effective java(6) 之消除过期的对象引用
effective java 之消除过期的对象引用1. 为什么要消除过期的对象引用java虽然有自己的垃圾回收机制,但是并没有那么的智能,对于被引用的对象,就算我们已经不在使用它了,但是java的回收机制是不会回收他们的,人们称之为“内存泄漏”。2、一个简单的栈实现的例子:import java.util.Arrays;import java.util.Em原创 2017-09-22 23:40:56 · 369 阅读 · 0 评论 -
effective java(7) 之避免使用终结方法
effective java 之避免使用终结方法1、终结方法其实是指finalize()。2、为什么要避免终结方法终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要使用它的。使用终结方法会导致行为不稳定,降低性能,以及可移植性的问题,不过终结方法也有其可用之处(后面介绍)。在C++中存在着析构器(destructors)这种帮助回收原创 2017-09-22 23:47:23 · 347 阅读 · 0 评论 -
effective java(8) 之覆盖equals时遵守通用的约定
effective java 之覆盖equals时遵守通用的约定1、覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重。最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自己相等。如果满足了一下任何一个条件,这都是所谓期望的结果:类的每个实例的本质上都是唯一的。对于代表活动实体而不是值的类来说确原创 2017-09-23 14:05:52 · 262 阅读 · 0 评论 -
effective java(9) 之覆盖equals时总要覆盖hashCode
effective java 之覆盖equals时总要覆盖hashCode1、每个覆盖了equals方法的类中,也必须覆盖hashCode方法。 2、为什么覆盖equals时,总要覆盖hashCode?原因是,根据Object规范:如果不这样的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括Ha原创 2017-09-23 14:13:52 · 202 阅读 · 0 评论 -
effective java(10) 之始终要覆盖toString
effective java 之始终要覆盖toString1、为什么要覆盖toString方法? public class Person { protected String name; protected int age; public String getName() { return name; } public void setName(Str原创 2017-09-23 14:17:57 · 284 阅读 · 0 评论 -
effective java(11) 之谨慎地覆盖clone
effective java 之谨慎地覆盖clone1、Cloneable接口表明这样的对象是允许克隆的,但这个接口并没有成功达到这个目的,主要是因为它缺少一个clone方法,Object的clone方法是受保护的。如果不借助反射,就不能仅仅因为一个对象实现了Colneable就可以调用clone方法,即使是反射调用也不能保证这个对象一定具有可访问clone方法。2、C原创 2017-09-23 14:19:41 · 264 阅读 · 0 评论 -
effective java(12) 之考虑实现Comparable接口
effective java 之考虑实现Comparable接口1、什么是Comparable接口?Comparable接口一般用于表示某个实例具有内在的排序关系。简单来说就是用于对象排序。2、为什么需要实现Comparable接口?我们可以对数值和字符串进行排序,是因为系统内部已经为我们定义了数值和字符串的排序关系。而我们定义的对象,本身是不包含排序关系的,因原创 2017-09-23 14:24:34 · 286 阅读 · 0 评论 -
effective java 之使用静态工厂方法替代构造方法
effective java 之使用静态工厂方法替代构造方法1、用构造方法创建对象:在Java中,创建对象常用的方法是通过公有构造方法创建;Boolean bTrue = new Boolean("true");public Boolean(String s) {this(toBoolean(s));}2、静态工厂方法创建对象:创建对象还原创 2017-09-08 22:58:40 · 426 阅读 · 0 评论 -
effective java(13) 之使类和成员的可访问性最小化
effective java 之使类和成员的可访问性最小化1、区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来。然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封装。2原创 2017-10-18 21:03:52 · 395 阅读 · 0 评论 -
effective java(28) 之利用有限制通配符来提升API的灵活性
effective java 之利用有限制通配符来提升API的灵活性1、如第25条所述,参数化类型是 不可变的(invariant)。换句话说,对于任何两个截然不同的类型tyle1和type2来说,List既不是List的子类型,也不是他的超类型。虽然List不是List的子类型,这与直觉相悖,但是实际上很有意义。你可以将任何对象放进一个List中,却只能将字符串放进中。同样我原创 2017-10-28 23:15:12 · 311 阅读 · 0 评论