欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Effective Java读书笔试之创建和销毁对象 博客分类: effective java effectivejava 

程序员文章站 2024-02-15 08:50:52
...

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();
   }
 

 

相关标签: effective java