EffectiveJava-2】的更多相关文章

先看一个栗子,看看能不能找出来里面的错误: /** * 请不要在新代码中使用原生态类型 * @author weishiyao * */ public class Test { public static void main(String[] args) { List<String> strings = new ArrayList<>(); unsafeAdd(strings, new Integer(42)); String string = strings.get(0); Sy…
有些语言支持函数指针.代理.lambda表达式,或者支持类似的机制,允许程序把“调用特殊函数的能力”储存起来并传递这种能力.这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为.比较器函数有两个参数,都是指向元素的指针.如果第一个参数所指的元素小于第二个参数所指的元素,则返回一个负整数:如果两个元素相等则返回零:如果第一个参数所指的元素大雨第二个,则返回一个正整数.通过传递不同的比较器函数,就可以获得各种不同的排列顺序.这正是策略模式的一个例子.比较器函数代表一种为元素排列的策略…
标签类: 有时候,可能会遇到带有两种甚至更多钟风格的类的实例的类,并包含表示实例风格的(tag)域.例如下面这个类,它能够表示圆形或者矩形: /** * 类层次优先与标签类 * @author weishiyao * */ // Tagged class - vastly inferior to a class hierarchy public class Figure1{ enum Shape { RECTANGLE, CIRCLE } // Tag field - the shape of…
Java程序设计语言提供两种机制,可以用来定义允许多个实现的类型:接口和抽象方法,这两者直接醉为明显的区别在于,抽象类允许某些方法的实现,但接口不允许,一个更为重要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类.任何一个类,只要定义了所有必要的方法,并且遵守通用约定,它就被允许实现一个借口,而不管这个类是处于类层次的哪个位置.因为Java只允许单继承,所有抽象类作为类型定义受到类极大的限制. 现有的类很容易被更新,以实现新的接口. 如果你希望让两个类扩展同一个抽象类,就必须把…
继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全.想到了很有名的一句话,你永远不知道你的用户是如何使用你写的程序的,一个程序员继承另一个程序员写的类也是同样的危险. 于方法调用不同的是,继承打破的封装性.换句话说,子类依赖于其超类中特定功能的实现细节.超类的实现有可能随着发行版本的不同而变化,如果真的发生了变化,子类可能会遭到破坏,即使它的代码完全没有修改过.因而,子类有必要随着超类的更新而…
考虑用静态构造方法代替构造器的好处: 1.静态构造方法有名字     BigInteger.probablePrime(int, int, Random)比 new BigInteger(int, int, Random)更加清楚,从名字知道返回可能是素数.     如果没有名字,将来给别人调用时,对方往往不知道该用哪个. 2.可以不必在每次调用时重新创建一个新对象     其实就是享元模式和单例模式 3.可以返回原类型的任何子类型对象.     这样可以使API变得更加简洁     这里可以引…
1, java中可以申明泛型类型的数组引用; 2, 但是不能实例化一个泛型数组对象; 3, 针对第二点, 可以曲线救国, 实例化一个Object数组, 再进行类型强转; 见代码如下: public class TestGeneric1<E> { //可以声明一个泛型数组的引用 private E[] array1; //编译报错,不能直接实例化一个泛型数组 //private E[] array2 = new E[10]; //实例化一个object数组,再进行类型转换 private E[]…
1, 父类的构造器方法中不能调用能够被子类重写的方法. 分析: 当初始化一个子类时, 首先要初始化父类, 即调用父类的构造方法; 如果父类的构造方法中调用了可被重写的其它方法, 那么此时调用的其实是该子类中重写的方法; 因此子类还没有初始化, 所以可能会造成一些问题. 示例代码如下: 父类: public class Father1 { public Father1() { overRide1(); } public void overRide1(){ System.out.println("父…
考虑用静态工厂方法代替构造器 一.概述 二.使用静态工厂的优势 获取类对象的两种方式: 使用公有构造方法 静态工厂方法 1.介绍 有名称 不必每次调用时创建一个新对象 可以返回原类型的任何子类型对象 在创建参数化类型实例的时候,它们使代码变得简洁 2.优势详解 优势一:有名称 一个常见的例子,并发库中的Executors工具类.Executor的静态工厂方法有不同的名字,更能清晰地表达要返回哪种类型的线程池对象. public class Executors { public static Ex…
--在大多数项目中,我们会经常使用int类型来声明final类型的常量,它在不考虑安全的情况下确实能满足我们绝大多数的需求.但是在JDK1.5版本发布之后,声明一组固定的常量组成合法值的类型就建议使用enum(枚举)类型代替.原因有三: – - -1.int类型对安全性和使用方便性没有任何帮助.就像你可以用==/=将不同类型进行对比甚至赋值,而这违背了它的final特性 - - - 2.如果与枚举常量关联的int发生了变化,客户端就必须重新编译.如果没有重新编译,它就会带着不确定的行为运行,你无…