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