
effective java
不挑食的程序猿
这个作者很懒,什么都没留下…
展开
-
《Effective java》读书记录-第45条-将局部变量的作用域最小化
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。较早的程序设计语言(如C)要求局部变量必须在一个代码块的开头处进行声明,这个习惯在Java中应该改正。1.要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。 2.几乎每个局部变量的声明都应该包含一个初始化表达式。 public void example1(){原创 2016-01-04 15:39:54 · 359 阅读 · 0 评论 -
《Effective java》读书记录-第11条-谨慎地覆盖clone
Cloneable接口的目的是作为对象的一个mixin接口(mixin interface),表明这样的对象允许克隆(clone)。Object的clone方法是受保护的。如果不借助与反射(reflection ),就不能仅仅因为一个对象实现了Cloneable,就可以调用clone方法。可以肯定的说,其他的接口都不应该扩展(extend)这个接口,为了继承而设计的类也不应该实现这个接口。由于它的缺点太多,有些专家级程序员干脆从来不去覆盖clone方法,也不去调用它,除非拷贝数组。你必须清楚一点,对于一原创 2016-01-06 20:05:31 · 543 阅读 · 0 评论 -
《Effective java》读书记录-第12条-考虑实现Comparable接口
compareTo方法并没有在Object中声明,它是Comparable接口中唯一的方法。compareTo不仅允许简单的等同比较,还允许执行顺序比较。一旦实现了Comparable接口,它就可以跟许多泛型算法(generic algorithm)以及依赖于该接口的集合实现(collection implementation)进行协作。事实上,Java平台类库中的值类(value clas原创 2016-01-07 14:26:53 · 461 阅读 · 0 评论 -
《Effective java》读书记录-第13条-使类和成员的可访问性最小化
要区别设计良好的模块与设计不好的模块,重要因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。这个概念被称为信息隐藏(information hiding)或封装(encapsulation)。只所以要信息隐藏,是因为它可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立地开发、测试、优化、使用、理解和修改。信息隐藏虽然不能带来更好的性能,但是它可以有效的原创 2016-01-08 10:51:50 · 489 阅读 · 0 评论 -
《Effective java》读书记录-第20条-类层次优于标签类
标签类过于冗长、容易出错,并且效率低下。子类化,能够更好的定义多种风格对象的单个数据类型。标签类正是类层次的一种简单的仿效。原创 2016-01-25 10:44:04 · 430 阅读 · 0 评论 -
《Effective java》读书记录-第21条-用函数对象表示策略
允许程序把“调用特殊函数的能力”存储起来并传递这种能力。这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为。这种方式称为“策略(Strategy)模式”。我们在设计具体的策略类时,还需要定义一个策略接口(strategy interface)。以这种方式使用匿名类时,将会在每次执行调用的时候创建一个新的实例。如果它被重复执行,考虑将函数对象存储到一个私有的静态final域里,并重用它。这样做的另一种好处是,可以为这个函数对象取一个有意义的域名称。原创 2016-01-26 14:33:02 · 528 阅读 · 0 评论 -
《Effective java》读书记录-第14条-在公有类中使用访问方法而非公有域
先留着原创 2016-01-08 15:54:33 · 685 阅读 · 0 评论 -
《Effective java》读书记录-第15条-使可变性最小化
不可变类是,其实例不能修改的类。每个实例所包含的信息都必须在创建该实例的时候提供,并在对象的整个生命周期内固定不变。使类变成不可变类应该遵循的5条规则:1.不要提供任何会修改对象状态的方法(mutator)。2.保证类不会被扩展。这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为。防止子类化,一般做法是使这个类成为final的,后续还会讨论其他做法。原创 2016-01-11 17:52:59 · 779 阅读 · 0 评论 -
《Effective java》读书记录-第16条-复合优先于继承
与方法调用不同的是,继承打破了封装性。public class InstrumentHashSet extends HashSet { private int addCount=0; /** * 创建一个新的实例 InstrumentHashSet * * */ pub原创 2016-01-12 15:54:57 · 344 阅读 · 0 评论 -
《Effective java》读书记录-第23条-请不要在新代码中使用原生态类型
声明中具有一个或者多个类型参数(type )的类或者接口,就是泛型( )类或者接口。泛型类和泛型接口统称为泛型( generic type)。每种泛型都可以定义一组参数化的类型( type),构成格式:类(接口)名。每种泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。原创 2016-02-14 17:27:55 · 623 阅读 · 0 评论 -
《Effective java》读书记录-第24条-消除非受检警告
用泛型编程时,会遇到许多编译器警告:非受检强制转化警告(unchecked cast warnings)、非受检方法调用警告、非受检普通数组创建警告、以及非受检转换警告(unchecked conversion warnings)。许多非受检警告很容易消除。有些警告比较难以消除。记住!要尽可能地消除每一个非受检警告。如果消除了所有警告,就可以确保代码是类型安全的。如果无法消除警告,同时可原创 2016-02-16 15:59:02 · 666 阅读 · 0 评论 -
《Effective java》读书记录-第25条-列表优先于数组
1、数组是协变的(convariant),如果Sub是Super的子类型,那么数组类型Sub[]就是Super[]的子类型。2、数组是具体化的(reified),因此数组在运行时才知道并检查它们的元素类型约束。为什么创建泛型数组是非法的?因为它不是类型安全的。数组和泛型有两个重要的不同点。从技术的角度来说,像E、List和List这样的类型应称作不可具体化的(nonreifiable)类型(不可具体化类型是指其运行时表示法包含的信息比它编译时表示法包含的信息更少的类型)。唯一可具体化(reifiab原创 2016-02-16 18:03:03 · 798 阅读 · 0 评论 -
《Effective java》读书记录-第10条-始终要覆盖toString
虽然遵守toString的约定并不像遵守equals和hashCode那么重要,但是,提供好的toString实现可以使类用起来更加舒适。toString方法应该包含对象中所有值得关注的信息。无论是否指定格式,都为toString返回值中包含的所有信息,提供一种编程式的访问途径。原创 2016-01-06 19:49:17 · 401 阅读 · 0 评论 -
《Effective java》读书记录-第9条-覆盖equals时总要覆盖hashCode
在每个覆盖equals方法的类中,也必须覆盖hashCode方法。散列函数应该把集合中不相等的实例均匀地分布到所有可能的散列值上。如果一个类是不可变的,就应该考虑把散列码缓存在对象内部,而不是每次请求的时候都重新计算散列码。如果大多数对象会被用作散列键(hash keys),就应该在创建实例的时候计算散列码。否则,可以选择“延迟初始化(lazily initialize)”散列码。不要试图从散列码计算中排除掉一个对象的关键部分来提高性能。虽然这样得到的散列函数运行起来可能更快,但是它的效果不见得好,可原创 2016-01-05 17:53:31 · 419 阅读 · 0 评论 -
《Effective java》读书记录-第5条-避免创建不必要的对象
最好能够重用对象,而不是每次需要的时候都需创建一个相同功能的对象。重用方式既快速,又流行。如果对象是不可变的,它就始终可以被重用。下面是一个比较极端的例子public static void main(String[] args){ test1(); test2(); } public static void test1(){原创 2015-12-31 11:00:25 · 361 阅读 · 2 评论 -
《Effective java》读书记录-第6条-消除过期的对象引用
1、内存泄漏-无意识的对象保持如果一个对象引用被无意识的保留起来了,那么,垃圾回收机制不仅不会处理这个对象,也不会处理被这个对象所引用的其他的对象。即使只有少数的几个对象被无意识地保留下来,也会有许多的对象被排除在垃圾回收机制之外,从而对性能造成潜在的重大影响。public class Stack { private Object[] elements; priv原创 2016-01-04 12:12:15 · 302 阅读 · 0 评论 -
《Effective java》读书记录-第4条-通过私有构造器强化不可实例化的能力
有时候,可能会需要编写一个只包含静态方法和静态域的类。这些类多是一些工具类,不希望被实例化。然而,在缺少显示构造器的情况下,编译器会自动构建一个无参的缺省构造器。如何避免编译器自动创建构造器,有些人会想到把类做成抽象类来强制该类不可实例化,这是行不通的,抽象类可以被子类化,这些子类可以被实例化;因此手动创建一个私有的构造器的方法,让编译器无法自动创建,同时也不能被外部类所实例化。pub原创 2015-12-29 09:33:40 · 340 阅读 · 0 评论 -
《Effective java》读书记录-第3条-用私有构造器或者枚举类型强化Singleton属性
public class Elvis1 { public static final Elvis1 INSTANCE=new Elvis1(); private Elvis1(){} public static Elvis1 getInstance(){ return INSTANCE; } public void leaveTheBuildi原创 2015-12-25 15:10:04 · 396 阅读 · 0 评论 -
《Effective java》读书记录-第2条-遇到多个构造器参数时要考虑用构建器
public class NutritionFacts { private final int servingSize; //(ml) private final int servings; //(per container) private final int calories; // private final int fat;原创 2015-12-24 15:32:18 · 489 阅读 · 0 评论 -
《Effective java》读书记录-第1条-考虑用静态工厂方法代替构造器
获取一个实例的方法有两种:1.就是提供一个公有的构造器。2.提供一个公有的静态工厂方法,它只是一个返回类的实例的静态方法。注意:静态工厂方法与设计模式中的工厂方法模式不同。静态工厂方法对于构造器具有以下一些优势。1.静态工厂方法有名称。构造器没有名称,不利于描述返回结果,只能通过其参数去猜测返回的实例所具有的属性。而如果用静态工厂方法就可以通过方法名来突出它们之原创 2015-12-23 11:15:12 · 463 阅读 · 0 评论 -
《Effective java》读书记录-第7条-避免使用终结方法
终结方法带来的问题:1.终结方法( finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的2.不要被System.gc和System.runFinalization这两个方法所诱惑3.使用终结方法会有非常严重的性能损失。会增加对象创建和销毁的时间终结方法合理用法:1.充当“安全网”2.与本地对等体(native peer)有关注意:“终结方法链(finalizer chaining)”并不会被自动执行原创 2016-01-04 16:37:58 · 516 阅读 · 0 评论 -
《Effective java》读书记录-第17条-要么为继承而设计,并提供文档说明,要么就禁止继承
可继承类必须有文档说明它可覆盖(overridable)的方法的自用性(self-use)。好的API文档应该描述一个给定的方法做了什么工作,而不是描述它是如何做到的。类必须通过某种形式提供适当的钩子(hook),以便能够进入到它的内部工作流程中,这种形式可以是精心选择的受保护(protected)方法,也可以受保护的域(比较少见)。对于为了继承而设计的类,唯一的测试方法就是编写子类。原创 2016-01-13 12:45:15 · 620 阅读 · 0 评论 -
《Effective java》读书记录-第8条-覆盖equals时需要遵守通用约定
覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误。1.类的每个实例本质上都是唯一的。2.不关心类是否提供了“逻辑相等(logical equality)”的测试功能。3.超类已覆盖equals,从超类继承过来的行为对于子类也是合适的。4.类是私有的或是包级私有的,可以确定它的equals方法永远不会被调用。equals方法实现了等价关系(equ原创 2016-01-05 15:01:16 · 378 阅读 · 0 评论 -
《Effective java》读书记录-第18条-接口优于抽象
接口和抽象类的区别1.抽象类允许包含某些方法的实现,但是接口不允许。2.为了实现由抽象类定义的类型,类必须成为抽象类的一个子类;只要类定义了所有必要的方法,并且遵守通用约定,它就被允许实现一个接口。现有的类可以很容易被更新,以实现新的接口。接口是定义mixin(混合类型)的理想选择。接口允许我们构造非层次结构的类型框架。现在有个接口代表歌手和原创 2016-01-14 13:46:50 · 428 阅读 · 0 评论 -
《Effective java》读书记录-第19条-接口只用于定义类型
接口应该只被用来定义类型,而不应该被用来导出常量原创 2016-01-22 14:51:34 · 454 阅读 · 0 评论 -
《Effective java》读书记录-第26条-优先考虑泛型
E 是不能创建不可具体化的(non-reifiable)类型的数组有两种解决办法。1、直接绕过创建泛型数组的禁令:创建一个Object的数组,并将它转换成泛型数组类型。原创 2016-02-18 18:26:11 · 408 阅读 · 0 评论