随笔分类 - Effective Java读书笔记
摘要:核心反射机制java.lang.reflect提供了“通过程序来访问关于已装载的类的信息”的能力,给定一个Class实例,可以获得Constructor、Method、Field实例,这些对象提供“通过程序来访问类的成员名称、域类型、方法签名等信息”的能力。 反射机制允许一个类使用另一个类,即使当前
阅读全文
摘要:应该优先使用接口而不是类来引用对象,考虑Vector的情况。 应该使用第一种方式,如果使用接口作为类型,程序将会更加灵活,当决定更换实现时,只需改变构造器中的类的名称(或者使用一个不同的静态工厂)。 注意,如果原来的实现提供了某种特殊的功能,而这种功能并不时这个接口通用约定所要求的,并且周围的代码又
阅读全文
摘要:字符串连接操作符(“+”)是把多个字符串合并为一个字符串的便利途径。要想产生单独一行的输出,或者构造一个字符串来表示一个较小的、大小固定的对象,使用连接操作符是合适的。但对于为连接n个字符串而重复地使用字符串连接操作符,需要n的平方级的时间,这是由于字符串不可变,当两个字符串被连接在一起,它们的内容
阅读全文
摘要:1.字符串不适合代替其他的值类型。只有当数据确实是文本信息时,才应该使用字符串,如果是数值,就应该被转换为适当的数值类型,如果是一个“是-或-否”的问题答案,应该被转换为boolean类型,如果是一个对象,应该使用对象引用来引用它。 2.字符串不适合代替枚举类型:枚举类型比字符串更加适合用来表示枚举
阅读全文
摘要:Java 1.5增加自动装箱和自动拆箱,对应基本类型int、double、boolean,装箱基本类型是Integer、Double、Boolean。这两种类型之间差别。 基本类型和装箱基本类型之间的三个主要区别: 1.基本类型只有值,而装箱基本类型具有与它们的值不同的同一性(两个装箱基本类型可以具
阅读全文
摘要:float和double主要为了科学计算和工程计算而设计,执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不适合用于需要精确结果的场合,尤其是货币计算。 使用舍入可以解决上面问题,但并不是所有的问题都能用舍入解决,如有1元,
阅读全文
摘要:假设希望产生位于0到某个上界之间的随机整数。可能会这样编写: 测试随机性: 结果接近于666666,由random方法产生的数字有2/3在取值范围的前半部分。 编写一个随机数生成的方法需要了解关于随机数生成器、数论和2的求补算法的相关知识。 现有的类库提供随机数生成的方法,不需要自己来做这样的工作,
阅读全文
摘要:for-each循环通过完全隐藏迭代器或者索引变量,避免混乱和出错的可能,适用于集合和数组和任何实现Iterable接口的对象。 使用传统for循环,容易出错: 期望打印出36个组合,实际上只打印出6个组合 修正: 使用嵌套for-each循环更简洁: 无法使用for-each循环的情况: 1.过滤
阅读全文
摘要:将局部变量的作用域最小化,可以增强个代码的可读性和可维护性,并降低出错的可能性。 方法: 1.在第一次使用它的地方声明。如果变量在使用之前声明,对于试图理解程序功能的读者来说,多了一个分散注意力的因素,等到用到该变量的时候,可能已经记不起变量的类型或者初始值了。 2.几乎每个局部变量的声明都应该包含
阅读全文
摘要:如果返回null, 在客户端处理代码就需要有额外的代码来处理null返回值: 而不是: 认为null返回值比零长度数组更好,因为避免了分配数组所需要的开销,是不对的。 1.除非分析表明这是方法的确影响了性能 2.对于不返回任何类型调用,返回同一个零长度数组是可能的 Collections类提供当需要
阅读全文
摘要:Java 1.5增加可变参数方法,可变参数方法接受0个或者多个指定类型的参数。 可变参数的机制通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法。 该方法如期望的那样,sum()=0,sum(1,2,3)=6 有时候,需要编写需要1个或者多个某类
阅读全文
摘要:试图根据一个集合是Set、Liist、还是其他的集合类型,对它进行分类的程序: 期望打印出的是Set,List,Unknown Collection,但实际上却是三个Unknown Collection。classify方法被重载,而要调用哪个重载方法是在编译时做出决定的,而三个集合的参数在编译时的
阅读全文
摘要:1.谨慎地选择方法的名称。遵循标准的命名习惯。 2.不过于追求提供便利的方法。方法太多会使类难以学习、使用、文档化、测试和维护。 3.避免过长的参数列表。目标是四个参数以下。 缩短参数列表的方法: (1)把方法分解成多个方法,可能会导致方法过多, 通过提升方法正交性,可以减少方法数目。java.ut
阅读全文
摘要:Java是一门安全的语言,但是如果不采取措施,还是无法保证安全性。假设类的客户端会尽其所能来破坏类的约束条件,因此必须保护性地设计程序。 考虑下面的类,声称表示一段不可变的时间周期: 因为Date本身是可变的,因此很容易违反起始时间不能在结束时间之后的约束。 为保护Period实例的内部信息被破坏,
阅读全文
摘要:绝大多数方法和构造器对于传递给它们的参数值都会有某些限制。如索引值不能为负数,对象引用不能为null。应该在文档中清楚指明限制,并且在方法体的开头处检查参数,以强制施加这些限制,以便在错误发生之后尽快检测出错误和确定错误根源。 对于公有方法,要用javadoc的@throws标签在文档中说明违法参数
阅读全文
摘要:标记接口是没有包含方法声明的接口,而只是指明一个类实现了具有某种属性的接口。考虑Serializable接口,通过实现这个接口,类表明它的实例可以被写到ObjectOutputStream。 标记接口相比标记注解的优点: 1.标记接口定义的类型是由被标记类的实例实现的;标记注解则没有定义这样的类型。
阅读全文
摘要:@Override 注解只能用在方法声明中,表示被注解的方法声明覆盖了超类型中的一个声明。 @Target指定注解只作用在方法 @Retention指定注解在编译的时候会被丢弃 应该在想要覆盖超类声明的每个方法声明中使用Override注解,这样当想要覆盖的方法没有被覆盖时,编译器能提示错误,大大减
阅读全文
摘要:Java 1.5之前,一般使用命名模式表明有些程序元素需要通过某种工具或者框架进行特殊处理。例如,JUnit测试框架原本要求用户一定要用test作为测试方法名称的开头。 命名模式的缺点:1.文字拼写错误导致失败,测试方法没有执行,也没有报错 2.无法确保它们只用于相应的程序元素上,如希望一个类的所有
阅读全文
摘要:枚举类型是不可扩展的,但是接口类型是可扩展的。使用接口,可以模拟可伸缩的枚举。 如一个简单的计算器: 实现接口Operation,里面只有一个apply方法。 基本的运算: 扩展该计算器: 使用: 接口模拟可伸缩枚举的不足:无法实现从一个枚举继承到另一个枚举,所以有些公共的功能是在每个枚举类中重复的
阅读全文
摘要:有时候,会见到利用ordinal方法来索引数组的代码。例如下面这个简化的类,表示一种烹饪用的香草: 假设有一个香草的数组,表示一座花园中的植物,想要按照类型(一年生、多年生或者两年生植物)进行组织后将植物列出来。 1.将集合放到一个按照类型的序数进行索引的数组中实现: 这种方法可行,但是由于数组与泛
阅读全文
浙公网安备 33010602011771号