![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective Java 读书笔记
heminjia888
这个作者很懒,什么都没留下…
展开
-
第16条:复合优于继承
首先明确:这里的继承只是指一个类拓展另一个类的情况,而不适用于接口继承(类实现接口,接口继承接口)。继承的风险:1、继承打破了封装性(当超类发生变化时,自类可能遭到破坏,即使他的代码没有变化)。2、下面的例子说明了继承中的另外一个问题。// Broken - Inappropriate use of inheritance!import java.util.*;public c原创 2014-03-13 16:37:30 · 88 阅读 · 0 评论 -
第4条:通过私有构造器强化不可实例化的能力
Java中有些工具类不需要实例化,实例化对它毫无意义,并且它们也没有必要子类化。比如:java.lang.Math、java.util.Arrays等。然而,在缺少显式构造器的情况下,默认有一个无参的构造器。所以我们采用显式方式定义一个私有构造器。这样该类就不能实例化、子类化了。我们也就达到目的了。注:1、不能实例化的原因是:无法在外部访问私有构造器。 2、不能子类化翻译 2014-03-08 22:01:11 · 420 阅读 · 0 评论 -
第64条:for-each循环优于for循环
1、每一个for循环中,迭代器或者是索引变量都要出现至少三次。这样很容易造成混乱。for (Iterator i = c.iterator(); i.hasNext(); ) {doSomething((Element) i.next()); // (No generics before 1.5)}This was the preferred idiom for iterating翻译 2014-03-15 19:28:16 · 510 阅读 · 0 评论 -
第48条:如果需要精确的答案,请避免适用float和double
1、float和double不能提供精确的结果。(不适合用于货币计算等场合)。2、需要精度的情况下要使用BigDecimal、int、long类型。 ①如果不介意性能,或想让系统自动记录十进制小数点,使用BigDecimal能提供较好的精度。 ②如果考虑性能,又不介意记录十进制小数点,那么适用int或者long。前提是数值不能超过int或long可表示范围的范围。翻译 2014-03-15 20:38:59 · 510 阅读 · 0 评论 -
第52条:通过接口引用对象
1、建议:如果有合适的接口类型存在,就要使用接口类型来声明参数、返回值、变量和域。养成这样的编码习惯:List subscribers = new Vector();List subscribers = new ArrayList();这样做是程序更加灵活,易于修改。2、也存在更适合用类来引用对象的情况。 ①对象是值类型(如:String,BigInteger)情况时。翻译 2014-03-16 15:17:19 · 469 阅读 · 0 评论 -
第20条:类层次优于标签类
标签类代码,一看便知何为标签类。// Tagged class - vastly inferior to a class hierarchy!class Figure { enum Shape { RECTANGLE, CIRCLE }; // Tag field - the shape of this figure final Shape shape;翻译 2014-03-13 18:32:03 · 577 阅读 · 0 评论 -
第19条:接口只用于定义类型
1、首先介绍常量接口的概念:只有静态final成员变量的接口(接口中成员变量默认为static final的)。常量接口是对接口的不良使用。这就相当于实现该接口的类将他要使用的常量暴露于外部。 2、对于常量的管理,合理的做法是:①如果常量与现有类或者接口关系紧密就将常量添加到类或接口中翻译 2014-03-13 18:19:24 · 577 阅读 · 0 评论 -
第23条(第五章 泛型):不要在新代码中使用原生态类型
java1.5中增加了泛型。声明中具有一个或多个参数类型的类或接口叫做泛型类或接口。泛型接口和类统称泛型。每个泛型都有其对应的原生态类型(raw type),即不带任何参数类型。泛型有子类型化规则:List是List的子类型,而不是List的子类型。翻译 2014-03-08 23:05:33 · 504 阅读 · 0 评论 -
第51条:当心字符串连接性能
1、为连接n个字符串而重复使用字符串连接操作符,需要n的平方级的时间。原因是:String类型对象时不可变的,每次进行+操作时,他们的内容都要被拷贝。2、由于StringBuilder是可变的,所以为了获得较好的性能,建议使用StringBuilder来代替String。public String statement() {StringBuilder b = new StringBuil翻译 2014-03-16 10:04:47 · 524 阅读 · 0 评论 -
第40条:谨慎设计签名
1、不要过于追求提供便利方法。每个方法都应该尽其所能。方法太多会使类难于学习、使用、文档化、测试、维护。只有当一项操作被经常使用时,才考虑将它提取出来设计成方法。2、避免过长的参数列表。 有三种方法缩短过长参数列表。 ①分解方法为多个方法。被分解的方法还可以相互配合产生新的操作。(实际操作挺困难)。 ②创建辅助类,用来保存参数的分组。如果一个频繁出原创 2014-03-14 17:01:04 · 124 阅读 · 0 评论 -
第1条:考虑用静态工厂方法代替构造器
首先要注意,这里说的静态工厂方法指的不是设计模式里的那个静态工厂。简单地说就是一个返回类的实例的静态方法。Effective java这本书可以说是一本经验谈,对于列出的每一条总结,都给出了优缺点,便于读者理解。所以我准备以后的几十篇读书笔记也就是围绕优缺点来写。先上代码 Public static Boolean value of(Boolean b) {return b?Boolean.tru翻译 2014-03-10 22:21:30 · 563 阅读 · 0 评论 -
第22条:优先使用静态成员类
嵌套类是定义在另一个类内部的类。嵌套类有四种:1静态成员类2、非静态成员类3、匿名类4局部类(方法内部的类)。这里主要讲静态成员类,至于什么是静态成员类翻译 2014-03-15 13:43:24 · 587 阅读 · 0 评论 -
第41条:慎用重载
下面代码意图是用重载识别参数类型。但由于客户端代码编写的问题造成类输出意外的结果。public class CollectionClassifier { public static String classify(Set s) { return "Set"; } public static String classify(List lst) {翻译 2014-03-14 22:48:04 · 452 阅读 · 0 评论 -
第14条:在公有类中使用访问方法而非公有域。
1、退化类(不好!!!):class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; }翻译 2014-03-11 22:47:28 · 530 阅读 · 0 评论 -
第18条:接口优于抽象类
1、接口是定义mixin(混合类型)的理想选择。2、骨架实现类:就是实现了接口的抽象类。骨架实现类结合了接口和抽象类的优点,骨架类中可以有一些接口方法的实现,也可以有接口中的抽象(abstract)方法。翻译 2014-01-25 10:31:45 · 466 阅读 · 0 评论 -
第13条:使类和成员的可访问性最小化
1、尽可能使类或成员不被外界访问。2、包含公有可变域的类不是线程安全的。3、如果final域是可变对象的引用,这是存在隐患的。比如:类具有共有的静态final数组域。这几乎总是错误的。public static final Thing[] VSLUES={...};改进1:把数组存储在一个不可变的List中。private static final Thing[] PRIVAT翻译 2014-03-11 22:02:31 · 553 阅读 · 0 评论 -
第2条:遇到多个构造器参数时,考虑用构建器。
这里的构建器是个不同于构造器的概念!首先,遇到多个构造器参数是,构造器和静态工厂方法都不能很好地适应。(因为简单的重载会使代码冗余度很高。)为了解决这个问题,下面我们介绍几种方法。1、重叠构造器public class NutritionFacts { private final int servingSize; // (mL) required翻译 2014-03-10 22:39:06 · 445 阅读 · 0 评论 -
第45条:将局部变量作用于最小化
1、最有力的方法就是:要用的时候在声明变量。2、每个局部变量的初始化表达式都应该包含一个初始化表达式。3、循环结构提供了特殊的机会使变量作用域最小。在循环结束后就不再需要循环变量的前提下,for循环优于while循环 。for (Iterator i = c.iterator(); i.hasNext(); ) {doSomething(i.next());}for (I翻译 2014-03-15 17:05:34 · 589 阅读 · 0 评论 -
第53条:接口优先于反射机制
关于“什么是反射机制”,不多解释。简单地说就是:允许一个类使用另一个类,即使当前者被编译的时候,后者还根本不存在。1、使用反射机制要付出的代价是:①丧失了编译时类型检查的好处。②代码变得笨拙而冗长。③性能损失。反射机制常常在设计的时候被用到,通常应用程序在运行时不应该以反射机制访问。翻译 2014-03-18 09:22:03 · 76 阅读 · 0 评论