`

Effective Java 中文版

阅读更多

第2章

第一条:考虑用静态工厂方法代替构造函数

        好处一:静态工厂方法具有名字,可以很好的描叙返回对象,设置属性。

        好处二:每次被调用,不要求非得创建一个新的对象。

        好处三:与构造函数不同,可以返回一个原类型的子类型的对象。

第二条:使用私有构造函数来强化singleton属性

       方法一:永远为一个singleton,性能稍微领先

       public static final SingletonMethod s= new SingletonMethod();

       private SingletonMethod()

          {      

          }

       方法二:稍微灵活

       private static final SingletonMethod s= new SingletonMethod();

       private SingletonMethod()

          {      

          }

       public static SingletonMethod getInstance()

          {

              return s;

           }

      为了使一个singleton类变成可序列化的,在声明中加上”implements Serilizable”外,也要提供一个readResolve方法

      Private Object readResolve() throws ObjectStreamException

{

return s;

}

第三条:通过私有构造函数强化不可实例化的能力

第四条:避免创建重复的对象

第五条:消除过期的对象引用

第六条:避免使用终结函数

 

第3章

7-11

 

4

第十二条:使类和成员的可访问能力最小化

第十三条:支持非可变性

第十四条:复合优先于继承

第十五条:要么专门为继承而设计,并给出文档说明,要么禁止继承

第十六条:接口优先于抽象类

    可以考虑将接口和抽象类的优点结合起来,对于你期望导出的每一个重要接口,都提供一个抽象的骨架实现。

第十七条:接口只是被用于定义类型

常量接口模式是对接口的不良使用

第十八条:优先考虑静态成员类

   

6章  方法

23条:检查参数的有效性

24条:需要时使用保护性拷贝

25条:谨慎设计方法的原型

26条:谨慎的使用重载

27条:返回零长度的数组而不是Null

28条: 为所有导出的API元素编写文档注释

 

7章 通用程序设计

29条:将局部变量的作用域最小化

30条:了解和使用库

31条:如果要求精确的答案,请避免使用floatdouble

32条:如果其他类型更适合,则避免使用字符串

33条:了解字符串连接的性能

34条:通过接口引用对象

35条:接口优先于映像机制

36条:谨慎的使用本地方法

37条:谨慎的进行优化

38条:遵守普遍接受的命名惯例

 

8

39条:只针对不正常的条件才使用异常

40条:对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常

41条:避免不必要的使用被检查的异常

42条:尽量使用标准的异常                            

43条:抛出的异常要适合于相应得抽象

44条:每个方法抛出的异常都要有文档

45条:在细节消息中包含失败—捕获信息

46条:努力使失败保持原子性

47条:不要忽略异常

 

 

9 线程

48条:对共享可变数据的同步访问

Synchronized关键字可以保证在同一时刻,只有一个线程在执行同一条语句,或者同一个代码块。

同步不仅可以阻止一个线程看到对象看到处于不一致的状态中,它还可以保证通过一系列看似顺序执行的状态转变序列,对象从一种一致的状态变迁到另一种一致的状态。

为了在线程之间可靠的通信,以及为了互斥访问,同步是需要的。

Volatile修饰符可以保证一个线程在读取一个域的时候都将会看到最近刚刚被写入的值。

49条:避免使用过多的同步

       在一个被同步的区域内部,不要调用一个可被改写的公有或受保护的方法

       通常,在同步区域内你应该做尽可能少的工作

       如果一个类或者一个静态方法依赖于一个可变的静态域,那么它必须在内部进行同步,即使它往往只用于单个线程。

50条:永远不要在循环的外面调用wait

       在等待之前测试条件,如果条件成立的话则跳过等待,这对于确保活性是必要的。

       在等待之后测试条件,如果条件不成立的话继续等待,这对于确保安全性是必要的。

      总是在一个while循环中调用wait,并且使用标准的模式。一般情况下,你应该使用notifyAll优先于notify

51条:不要依赖于线程调度器

       不要依赖Thread.yield或者线程优先级。

52条:线程安全性的文档化

 

53条:避免使用线程组

 

 

10 序列化

序列化技术为远程通信提供了标准的线路层对象表示,也为javaBean组件结构提供了标准的永久数据格式。

54条:谨慎的实现Serializable

       提供一个可访问的无参数构造函数,该设计方案允许(但不要求)子类实现Serializable

 

55条:考虑使用自定义的序列化形式

       transient  Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。

      

56条:保护性的编写readObject方法

       当一个对象被反序列化的时候,对于客户不应该拥有的对象引用,如果哪个域包含了这样的对象引用,则必须要做保护性拷贝,这是非常重要的。

       对于每一个可序列化的非可变类,如果它包含了私有的可变组件,那么在它的readObject方法中,必须要对这些组件进行保护性拷贝。

       对于非final的可序列化的雷,在readObject方法和构造函数之间还有类似的地方,readObject方法不可以调用可被改写的方法,无论是直接调用还是间接调用都不可以。

57条:必要时提供一个readResolve方法

       readResolve方法不仅仅对于singleton对象是必要的,而且对于所有其他的实例受控的类也是必需的。

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

       
                                                                  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics