![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective Java
-船长-
Java Web 程序员 !
展开
-
Effective Java 第6条:消除过期的对象引用
当你从手工管理内存的语言(比如C或C++)转换到具有垃圾回收功能的语言的时候,程序员的工作会变得更加容易,因为当你用完了对象之后,它们会被自动回收。当你第一次经历对象回收功能的时候,会觉得这简直有点不可思议。这很容易给你留下这样的印象,认为自己不再需要考虑内存管理的事情了。其实不然。考虑下面这个简单的栈实现的例子:// Can you spot the "memory leak"?原创 2013-07-30 22:29:44 · 2709 阅读 · 0 评论 -
EffectiveJava 第3条 :用私有构造器或者枚举类型强化Singleton属性
Singleton只不过是指仅仅实例化一次的类[Gamma95, p. 127]。Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统。使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Singleton替换模拟实现,除非它实现一个充当其类型的接口。在Java 1.5发行版本之前,实现Singleton有两种方法。这两种方法都要把构造器保持原创 2013-07-28 17:37:05 · 2577 阅读 · 0 评论 -
EffectiveJava 第2条 :遇到多个构造器参数时要考虑用构建器(2)
转载地址: http://book.51cto.com/art/200901/106048.htm幸运的是,还有第三种替代方法,既能保证像telescoping constructor模式那样的安全性,也能保证像JavaBeans模式那么好的的可读性。这就是Builder模式[Gamma95,p.97]的一种形式。不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),转载 2013-07-25 23:37:17 · 2504 阅读 · 0 评论 -
Effective Java 第 18 条:接口优于抽象类
Java程序设计语言提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。这两种机制之间最明显的区别在于,抽象类允许包含某些方法的实现,接口则不允许。一个更为重要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。任何一个类,只要它定义了所有必要的方法,并且遵守通用约定,它就被允许实现一个接口,而不管这个类是处于类层次(class hierarchy)的哪个位置。因为Jav原创 2013-08-07 17:57:16 · 2760 阅读 · 0 评论 -
Effective java 第 19 条: 接口只用于定义类型
当类实现接口时,接口就充当可以引用这个类的实例的类型(type)。因此,类实现了接口,就表名客户端可以对这个类的实例实施某些动作。为了任何其他目的的而定义的接口是不恰当的。有一种接口被称为常量接口(constant interface) ,它不满足上面的条件。这种接口没有包含任何方法,它只包含静态的final域,每个域都导出一个常量。使用这些常量的类实现这个接口,以避免用类名来修饰常量名。原创 2013-08-08 11:55:46 · 3373 阅读 · 1 评论 -
Effective Java 第 20 条: 类层次优于标签类
有时候,可能会遇到带有两种甚至更多种风格的实例的类,并包含表示实例风格的标签(tag)域。例如,考虑下面这个类,它能够表示圆形或者矩形:原创 2013-08-08 15:21:44 · 2780 阅读 · 0 评论 -
Effective Java 第 21 条: 用函数对象表示策略
有些语言支持函数指针(function pointer)、代理(delegate)、lambda表达式(lambda expression),或者支持类似的机制,允许程序把“调用特殊函数的能力”存储起来并传递这种能力。这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为。Java没有提供函数指针,但是可以通过对象引用实现同样的功能。调用对象上的方法通常是执行该对原创 2013-08-08 23:51:03 · 3171 阅读 · 0 评论 -
Effective Java 第 22 条:优先考虑静态成员类
嵌套类(nested class)是指被定义在另一个类的内部的类。嵌套类存在的目的应该是为它的外围类(enclosing class)提供服务。如果嵌套类将来可能会用于其他的某个环境中,它就应该是顶层类(top-level class)。嵌套类有四种:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous原创 2013-08-09 12:00:49 · 3444 阅读 · 0 评论 -
Effective Java 第 23 条: 请不要在新代码中使用原生态类型
从jdk1.5版本开始,java就引入了泛型。在没有泛型之前,从集合中取出的对象都必须经过转型,才能够达到使用。在jdk1.5之前,如果往集合中插入了不同类型的对象的话,那么在遍历的时候就可能引起运行时转型失败。泛型定义:A class or interface whose declaration has one or more type parameters is a generic cla原创 2013-08-09 17:22:14 · 2712 阅读 · 0 评论 -
Effective Java 第4条:通过私有构造器强化不可实例化的能力
有时候,可能需要编写只包含静态方法和静态域的类。这些类的名声很不好,因为有些人滥用它们来避免从对象的角度进行思考,但是它们也确实有它们特有的用处。我们可以利用这种类,以java.lang.Math或者java.util.Arrays的方式,把基本类型的值或者数组类型上的相关方法组织起来。我们也可以通过java.util.Collections的方式,把实现特定接口的对象上的静态方法(包括工厂方法,原创 2013-07-28 22:57:59 · 2528 阅读 · 0 评论 -
Effective Java 第8条:覆盖equals时要遵守通用约定
转载 : http://architecture3.riaos.com/?p=3092399覆盖equals方法貌似很简单,但是有许多覆盖方式会导致错误,所以们应该做到要么不覆盖equals方法,要么覆盖时就要遵守通用约定。一、什么情况下可以不覆盖equals方法如果不覆盖equals方法,那该类的每个实例都只与它自身相等,而有时候这就是我们需要的。1、类的每个实例转载 2013-07-31 23:27:39 · 2524 阅读 · 0 评论 -
Effective Java 第16条 : 复合优先于继承
继承(指的是子类扩展超类,并不包含接口)是实现代码重用的有力手段,但它并不总是完成这项工作的最佳工具。不适当地使用继承会导致脆弱的软件。 与方法调用不同的是,继承打破了封装性。换句话说子类依赖于超类中特定功能的实现细节。超类的实现可能随着发行版本而变化,就有可能影响子类。因此,子类必须要跟着超类的更新而发展。除非超类是专门为扩展而设计的,并且具有很好的说明文档。原创 2013-08-03 15:36:52 · 3146 阅读 · 0 评论 -
Effective Java 第7条:避免使用终结函数
终结函数(finalizer)是不可预测的,通常也是很危险的,一般情况下是不必要的。使用终结函数会导致行为不稳定、降低性能,以及可移植性问题。当然,终结函数也有其可用之处,我们将在本条目的最后再做介绍;但是根据经验,应该避免使用终结函数。C++的程序员被告知"不要把终结函数当作是C++中析构器(destructors)的对应物"。在C++中,析构器是回收一个对象所占用资源的常规方法,是构造原创 2013-07-30 22:53:35 · 2673 阅读 · 0 评论 -
Effective Java 第5条:避免创建不必要的对象
一般来说,最好是重用对象而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既更加快速,也更为流行。如果对象是不可变的(immutable)(见第15条),它就始终可以被重用。作为一个极端的反面例子,考虑下面的语句:String s = new String("stringette"); // DON'T DO THIS!该语句每次被执行的时候都创建一个新的Str原创 2013-07-30 22:27:25 · 2596 阅读 · 0 评论 -
Effective Java 第13条 : 使类和成员的可访问性最小化
转载地址: http://www.blogjava.net/kuuyee/archive/2013/06/14/400560.html软件设计的基本原则之一,就是系统要模块化,模块之间只通过他们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称作信息隐藏(information hiding)或封装(encapsulation)。需要遵守的原则转载 2013-08-01 17:54:25 · 2583 阅读 · 0 评论 -
Effective Java 第14条:在公有类中使用访问方法而非公有域
转载: http://yanfeichening.iteye.com/blog/1497657如果类可以在它所在包的外部进行访问,就提供访问方法。如果类是包私有的,或者私有的嵌套类,直接暴露它的数据域并没有本质的错误。总之,公有类永远都不应该暴露可变的域。虽然还是有几个问题,但是让公有类暴露不可变的域,危害比较小。但是,有时候需要会用到包级私有的或者私有的嵌套类转载 2013-08-01 18:01:25 · 2512 阅读 · 0 评论 -
Effective Java 第 15 条: 使可变性最小化
不可变类只是实例不能被修改的类。每个实例中包含的所有信息都必须在创建实例的时候就提供,并在对象的整个生命周期(lifetime)内固定不变。Java 平台类库中包含许多不可变的类,其中有String、基本类型包装类、BigInteger 和 BigDecimal。存在不可变的类有许多理由:不可变的类更加易于设计、实现和使用。他们不容易出错,且更加安全。原创 2013-08-02 12:12:45 · 2504 阅读 · 0 评论 -
EffectiveJava 第2条 :遇到多个构造器参数时要考虑用构建器(1)
转载地址:静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。考虑用一个类表示包装食品外面显示的营养成份标签。这些标签中有几个域是必需的:每份的含量、每罐的含量以及每份的卡路里,还有超过20个可选域:总脂肪量、饱和脂肪量、转化脂肪、胆固醇、钠等等。大多数产品都只有几个可选域中会有非零的值。对于这样的类,应该用哪种构造器或者静态方法来编写呢?程序员一向习惯采用te转载 2013-07-25 23:31:47 · 2514 阅读 · 0 评论 -
EffectiveJava 第1条 :创建和销毁对象--考虑用静态方法代替构造器
转载:http://www.cnblogs.com/forstudy/archive/2013/05/05/3061913.html当创建对象时,直接使用构造器是最自然不过的事情,但不妨考虑一下静态工厂方法。注:区别于设计模式中的工厂方法,它只是一个静态的方法而已;设计模式中的工厂方法通常包括商品和工厂两个组件,没那么复杂。 因为它可以为你带来以下构造器转载 2013-07-19 18:15:55 · 901 阅读 · 0 评论 -
Effective Java 第17条:要么为了继承而设计,并提供文档说明,要么禁止继承
其实在 16 条中说过继承的缺点: 可能会导致子类很脆弱,如果超类用了自用模式并且没有提供相关的文档说明。 后期版本更新中,有可能导致子类实现的方法和超类中同名,从而成为覆盖父类方法。所以设计超类的时候需要注意这些实质性的规则:首先,该类的文档必须精确地描述覆盖每个方法所带来的影响。该类必须有文档说明其可改写的方法的自用性:对于每一个公有的或原创 2013-08-03 22:55:59 · 2824 阅读 · 0 评论 -
Effective Java 第 24 条:消除非受检警告
用泛型编程时,会遇到许多编译器警告:非受检强制转化警告(unchecked cast warnings)、非受检方法调用警告、非受检普通数组创建警告、以及非受检转换警告(unchecked conversion warnings)。当你越来越熟悉泛型之后,遇到的警告也会越来越少,但是不要期待从一开始用泛型编写代码就可以正确地进行编译。 有许多非受检警告很容易清楚。例如,假设意外的编写了这样一原创 2013-08-09 18:35:56 · 3268 阅读 · 0 评论