`
yuyiming1986
  • 浏览: 62094 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Effective Java读书笔试之创建和销毁对象

阅读更多

Effective Java读书笔试之创建和销毁对象

 

 

1.考虑用静态工厂方法代替构造函数

 

   静态工厂方法的第一个好处是,与构造函数不同,静态工厂方法有名字,接口有更好的类型表达能力。

 

   静态工厂方法的第二个好处是,与构造函数不同,它每次被调用的时候,不要求非得创建一个新的对象,特别是对于不变对象而言,可以在被调用时返回同一个对象的引用,重用对象.

   public static Boolean valueOf(boolean b){
	return (b?Boolean.TRUE:Boolean.FALSE);
   }
 

 

   静态工厂方法的第三个好处是,与构造函数不同,它们可以返回一个子类型的对象(接口)。

 

 

2.使用私有构造函数强化singleton属性

 

  实现singleton有两种方法,这两种方法都要把构造函数保持为private,并且提供一个公有静态成员,对外提供访问路径。

 

  一种方法是使用公有final静态成员

  public class Elvis{
     public static final Elvis INSTANCE = new Elvis();

     private Elvis(){

     }
  }
 

 

  二种方法是提供一个静态工厂方法,而不是final static域。

  public class Elvis{
      private static final Elvis INSTANCE = new Elvis();

      public static Elvis getInstance(){
	   return INSTANCE;
      }
  }	
 

 

3.私有构造函数强化不可实例化的能力

 

  有些工具类(utility class,内部成员大部是静态方法,静态属性)不希望被实例化,进行实例化也没有任何意义,可以通过让这个类定义一个显式的私有构造函数确定它不被实例化。

 

  这种作法的一个副作用是一个类不能被继承,因为没有构造函数可以被子类调用。

 

 

4.避免创建重复的对象

 

  对一个非可变的对象,它总是可以被重用的。

 

  在循环中String str = new String("silly");每次循环总是会创建一个新的但是又不变的对象,很浪费;而使用String str = "silly";

则每次循环中不会创建新的对象,会重用字符串池中的"silly".

 

  对于非可变对象可以提供静态工厂方法来重用同一个非可变对象。

 

 

5.消除过期的对象引用

 

  如果一个对象引用被无意识地保留起来,那么垃圾回收机制不仅不会处理这个对象,而且也不会处理这个对象引用的所有其他对象。

 

  一个例子是Stack中使用Object elements[]数组来存储元素,在pop操作时,只是return elements[--size];此时elements[--size]还是存储着对返回对象的引用,这个对象被无意识的引用在elements[--size]位置上,导致垃圾回收机制没有办法回收此元素。

 

  修复这类问题很简单:如果对象引用过期,只需清空这些引用就可以了。

 

  应该修改pop代码:

      Object result = elements[--size];

      elements[size] = null;
      return result;        

 

 

6.避免使用终结函数

  Java虚拟机不保证终结函数会被及时地执行,而且也根据不保证它们会被执行,所以如果资源的释放依赖于终结函数执行的时间点,将是不可靠的。避免使用finalize()方法.

 

  如果一个类的封装资源需要回收,一个方法是提供一个显式的终止方法,并要求此类的客户端在每个实例不再有用的时候调用这个方法。实例必须要记录下自己是否已经被终止,如果这个对象已终被终止之后,还被调用的话,就应该抛出IllegalStateException异常。

 

  一个典型的实例:

  InputStream和OutputStream的close()方法

 

   显式的终止方法通常与try-finally结合起来使用,以确保及时终止,也就是说不论什么情况下,资源释放的终止函数都会被调用执行.

   Foo foo = new Foo();

   try{
      //DO what must be done with foo
   }finally{
      foo.terminate();
   }
 

 

分享到:
评论
1 楼 hanmiao 2014-02-25  
博客已经806天不再更新了,长草了都...

相关推荐

Global site tag (gtag.js) - Google Analytics