读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有一种很好的机制去解决一些局限性,这种机制就是反射(后续);

逃避不一定躲得过,面对不一定最难过
原文地址:https://www.cnblogs.com/yangzhenlong/p/4756298.html