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

    逃避不一定躲得过,面对不一定最难过
  • 相关阅读:
    gdb
    wine
    xen
    编程都是人上人,果不其然!2020年度十大高薪岗位,程序员独领风骚!
    【C++学习笔记】深入了解C++ 结构体与共用体,看这篇就够了!
    谁说C语言很简单?这14道C语言谜题,简直难哭了...
    十行代码15个 bug!程序员:不知道有句话当讲不当讲?
    【C++学习笔记】C++ 使用new与delete时,你注意到这3个地方了吗?
    【C++学习笔记】一分钟带你了解C++中new和delete的使用方法!
    惊!黄道十二宫杀手密码,半个世纪未解之谜,竟然被他们破解了...
  • 原文地址:https://www.cnblogs.com/yangzhenlong/p/4756298.html
Copyright © 2011-2022 走看看