随笔分类 -  Effective Java读书笔记

摘要:如果一个枚举类型的元素主要用在集合中,一般使用int枚举模式,将2的不同倍数赋予每个常量: 表示为文字添加STYLE_BOLD和STYLE_ITALIC两种风格。 如果文字要添加的风格很多,applyStyles的参数就非常长,而且,当有64种风格以上的时候,就没法使用这种办法,因为1<<65已经超 阅读全文
posted @ 2016-08-02 16:49 没有梦想的小灰灰 阅读(433) 评论(0) 推荐(0)
摘要:枚举天生域一个单独的int值关联,根据枚举常量在类型中的数字位置,从0开始计数。所有枚举都有一个ordinal方法,返回每个枚举常量在类型中的数字位置。 大多数程序不需要这个方法,它是被设计成用于像EnumSet和EnumMap这种基于枚举的通用数据结构的。 不要根据枚举的序数导出与它相关联的值,而 阅读全文
posted @ 2016-08-02 16:03 没有梦想的小灰灰 阅读(188) 评论(0) 推荐(0)
摘要:在java1.5之前,表示枚举类型的常用模式是声明一组具名的int常量,每个类型成员一个常量: 缺点: 1.将apple传到想要orange的方法中,不会出现错误 2.用==操作符将apple与orange比较,不会出现错误 3.int枚举是编译时常量,被编译到客户端中,如果枚举常量关联的int发生 阅读全文
posted @ 2016-08-02 15:47 没有梦想的小灰灰 阅读(1702) 评论(0) 推荐(0)
摘要:一个Set只有一个类型参数,表示它的元素类型,一个Map有两个类型参数,表示它的键和值类型。 但是有时候,需要更多的灵活性,如,数据库行有任意多的列,希望能以类型安全的方式访问所有的列。办法是将键进行参数化而不是将容器参数化,然后将参数化的键提交给容器,来插入或者获取值。用泛型系统来确保值的类型与它 阅读全文
posted @ 2016-08-01 22:47 没有梦想的小灰灰 阅读(256) 评论(0) 推荐(0)
摘要:参数化类型是不可变的。对两个不同类型T1和T2而言,List<T1>与List<T2>没有父子类型关系。 考虑: 假设增加一个方法,按顺序将一系列的元素放到堆栈中: 如果尝试这样做: 从逻辑上讲,这样应该是允许的,因为Integer是Number的子类,应当允许将Integer放到类型为Number 阅读全文
posted @ 2016-08-01 17:31 没有梦想的小灰灰 阅读(354) 评论(0) 推荐(0)
摘要:如类可以从泛型中受益,方法也一样。静态工具方法尤其适合于泛型化。Collections中所有的方法是泛型化的。 一个返回两个集合的联合的例子: 有两条警告,因为使用的是原生态类型Set。 泛型化该方法: 不再提示警告,因为它是类型安全的了。 泛型单例工厂:有时候需要创建不可变但又适合于不同类型的对象 阅读全文
posted @ 2016-07-31 23:46 没有梦想的小灰灰 阅读(330) 评论(0) 推荐(0)
摘要:考虑第6条的简单堆栈实现: 将该类泛型化可以提高类型的安全性,方便客户端使用(无需显式强制转换类型) 首先用类型参数替换所有的Object类型: 由于不能创建不可具体化类型的数组,所有有错误(new E[DEFAULT)INITIAL_CAP]是不允许的) 解决方法: 1.创建一个Object数组, 阅读全文
posted @ 2016-07-30 23:56 没有梦想的小灰灰 阅读(361) 评论(0) 推荐(0)
摘要:数组与泛型相比,有两个重要的不同点。数组是协变的(如果Sub是Super的子类型,那么数组类型Sub[]是Super[]的子类型),相反,泛型是不可变得,对于任意两个不同的类型T1和T2,List<T1>和List<T2>没有子类型或超类型的关系。 一段代码: 会有一条警告,编译器无法再编译时知道E 阅读全文
posted @ 2016-07-29 17:21 没有梦想的小灰灰 阅读(396) 评论(0) 推荐(0)
摘要:用泛型编程时,会遇到许多编译器警告:非受检强制转化警告(unchecked cast warning)、非受检方法调用警告、非受检普通数组创建警告、非受检转换警告。 许多非受检警告很容易消除,如: 编译器提醒你 HashSet is a raw type. References to generic 阅读全文
posted @ 2016-07-29 15:17 没有梦想的小灰灰 阅读(193) 评论(0) 推荐(0)
摘要:Java 1.5发行版本增加了泛型。在没有泛型之前,从集合中读取到的每一个对象都必须进行显式转换,一旦插入了类型错误的对象,在运行时出错才被发现。有了泛型之后,就可以告诉编译器每个集合中接受哪些对象类型,编译器会自动进行转换,并在编译时告知是否插入类型错误的对象。 泛型指声明中具有一个或者多个类型参 阅读全文
posted @ 2016-07-29 14:47 没有梦想的小灰灰 阅读(685) 评论(0) 推荐(0)
摘要:嵌套类指被定义在一个类的内部的类。嵌套类存在的目的应该只是为它的外围类提供服务。如果嵌套类将来可能用于其他环境,它应该是顶层类。 嵌套类有四种:静态成员类,非静态成员类,匿名类,局部类。 静态成员类的常见用法是作为公有的辅助类,仅当与外部类一起使用才有意义,考虑一个枚举,它描述计算器支持的各种操作, 阅读全文
posted @ 2016-07-27 22:14 没有梦想的小灰灰 阅读(365) 评论(0) 推荐(0)
摘要:C语言标准库中的qsort函数要求用一个指向comparator函数的指针作为参数,它用这个函数来比较待排序的元素。比较器有两个参数,都是指向元素的指针。通过传递不同的比较器函数,可以获得不同的排列顺序,这是策略模式的一个例子。比较器函数代表一种为元素排序的策略。 java.util表中有一个Com 阅读全文
posted @ 2016-07-26 22:59 没有梦想的小灰灰 阅读(268) 评论(0) 推荐(0)
摘要:标签类值带有两种甚至多种风格的实例的类,如一个表示圆或者矩形的类: 这种标签类过于冗长,容易出错,并且效率低下。 在Figure类中,只有area方法是矩形或者圆都有的,将它放在类层次的根。 类层次可以反映正方形是一种特殊的矩形: 上述的域是被直接访问的,而不是通过访问方法,应该使用访问方法。 标签 阅读全文
posted @ 2016-07-26 22:04 没有梦想的小灰灰 阅读(182) 评论(0) 推荐(0)
摘要:当类实现接口,接口就充当可以引用这个类的实例的类型。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作,为了其他任何目的而定义接口是不恰当的。 有一种常量接口,它不包含任何方法,只包含静态的final域,每个域导出一个常量,使用这些常量的类实现这个接口,以避免用类名来修饰常量名: 这是对 阅读全文
posted @ 2016-07-26 00:11 没有梦想的小灰灰 阅读(172) 评论(0) 推荐(0)
摘要:Java提供两种机制,可以用来定义允许多个实现的类型:接口和抽象类。在Java 1.8之前,这两种机制最大的区别是,抽象类允许包含某些方法的实现,但是接口则不允许(这种情况在Java 1.8发布后被改变,接口可以用default修饰符来声明一个有实现的方法。 接口的好处: 1.现有的类可以很容易被更 阅读全文
posted @ 2016-07-25 23:52 没有梦想的小灰灰 阅读(238) 评论(0) 推荐(0)
摘要:继承是实现代码重用的有力手段,但是使用不当会导致软件变得脆弱。在包的内部使用继承是非常安全的,子类和超类的实现都处在同一个程序员的控制之下。对于专门为了继承而设计、并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而们对于进行跨越包边界的继承,则要非常小心。“继承”在这里特指一个类扩展另一个 阅读全文
posted @ 2016-07-20 00:28 没有梦想的小灰灰 阅读(505) 评论(0) 推荐(0)
摘要:不可变类是实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。Java平台包含的不可变类:String、基本类型的包装类、BigInteger、BigDecimal。不可变类比可变类更容易设计、实现和使用。 为了使类成为不可变,要遵循五条规则 阅读全文
posted @ 2016-07-18 16:43 没有梦想的小灰灰 阅读(445) 评论(0) 推荐(0)
摘要:如上面Point类的数据域是可以直接被访问的,这样的类没有提供封装。如果不改变API,就无法改变它的数据表示法(比如,使用一个比double更高精度的类来表示x和y),也无法强加任何约束条件(比如以后我们可能会希望x和y不会超过某个值)。 使用私有域和公有访问方法的公有类是比较合适的。在它所在的包的 阅读全文
posted @ 2016-07-15 23:59 没有梦想的小灰灰 阅读(578) 评论(0) 推荐(0)
摘要:区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来。然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封 阅读全文
posted @ 2016-07-14 16:43 没有梦想的小灰灰 阅读(326) 评论(0) 推荐(0)
摘要:CompareTo方法没有在Object中声明,它是Comparable接口中的唯一的方法,不但允许进行简单的等同性比较,而且允许执行顺序比较。类实现了Comparable接口,就表明它的实例具有内在的排序关系。为实现Comparable接口的对象排序:Arrays.sort(a); 一旦实现了Co 阅读全文
posted @ 2016-07-14 15:01 没有梦想的小灰灰 阅读(276) 评论(0) 推荐(0)