读Effective Java笔记之one:static Factory methods instead of Constructors (静态工厂方与构造器)
获取类的实例的方法有很多种,在这很多种方法中,它们各有优缺,各有特点。这里,只介绍2中方法
1.使用构造方法
public class Person { private String sex; /** * <构造函数> */ public Person(String sex) { this.sex = sex; System.out.println("this is constructor method"); } }
调用如下:
1 public static void main(String[] args) 2 { 3 Person male = new Person("男"); 4 Person female = new Person("女"); 5 }
这里可以看到,使用构造获取类的实例,每次都要new(创建新对象),每个实例对象都不相同,不能重复使用,降低了效率。并且构造方法名称与类名必须一致,如果构造方法太多(参数不同),容易引起混淆。
2.静态工厂方法
1 /** 2 * <构造函数> 3 */ 4 public Person(String sex) 5 { 6 this.sex = sex; 7 System.out.println("this is constructor method"); 8 } 9 10 private final static Person male = new Person("男"); 11 private static final Person female = new Person("女"); 12 /** 13 * <静态工厂方法> 14 * <功能详细描述> 15 * @return 16 * @see [类、类#方法、类#成员] 17 */ 18 public static Person getMale(){ 19 return male; 20 } 21 public static Person getFemale(){ 22 return female; 23 }
调用:
1 public static void main(String[] args) 2 { 3 Person male = Person.getMale(); 4 Person female = Person.getFemale(); 5 }
上面可以看到:
静态工厂方法的方法名可以是任意的,这一特性的优点是可以提高程序代码的可读性
静态工厂方法每次被调用的时候,是否会创建一个新的对象完全取决于方法的实现(上面的实现是不会创建新对象)
new语句只能创建当前类的实例,而静态工厂方法可以返回当前类的子类的实例,这一特性可以在创建松耦合的系统接口时发挥作用
但是,同样它有缺点:
静态工厂方法依赖于构造方法,如果构造为private或者default,就无法使用该方法;
静态工厂所用的都是静态方法,所以有其局限性。但是java有一种很好的机制去解决一些局限性,这种机制就是反射(后续);
逃避不一定躲得过,面对不一定最难过