最近学习Android知识,发现Java好多的基础知识运用的真的很一般,所以决定在重新梳理一下,现在Kotlin也来了,在Android之路上,留给我看Java的时间不多了。
静态我们就来简单介绍一下,使用静态工厂方法创建对象相较于构造器创建的对象的优缺点。主要概括如下:
优点:
- 静态工厂方法有名称,可以明确的创建对应功能和属性的Java对象
- 静态工厂方法可以预构建Java对象,实现在必要的情况下创建尽量少的对象实例
- 静态工厂方法可以获取预构建Java对象的任何子类对象
- 静态工厂方法在构建参数化实例的时候,代码更简洁
缺点:
- Java类如果没有公有的或者受保护的构建器,就不能被子类化
- 静态工厂方法和一般静态方法没有任何区别
静态工厂方法与构造器创建Java对象的对比已经介绍完了,下面就来针对优点当中的第四条结合代码说明一下。特别说明,今天介绍的是针对JDK1.6以及以下,高版本不存在今天介绍的问题了。还有就是没有介绍优点三直接介绍优点四是因为第三条有点难,需要好好理解一下。
1,静态工厂方法可以在构建参数化实例的时候使代码更简洁
这里说到我们的参数化实例不得不提到我们的集合框架了,比如我们创建一个Map对象:
HashMap<String,String> map=new HashMap<String,String>();
当然了,这是jdk1.6以及之前的,在1.7以及以上版本,我们就可以写成:
HashMap<String,String> map=new HashMap<>();
我们可以看出在1.6以及更低版本,我们在定义这样参数化实例对象的时候写了很多重复的代码,可能这个示例看不出来,那我再举一个例子你就明白啦:
HashMap<String, HashMap<String, ArrayList<LinkedList<TreeMap<HashMap<String, TreeSet<Integer>>, ArrayList<String[]>>>>>> map = new HashMap<String, HashMap<String, ArrayList<LinkedList<TreeMap<HashMap<String, TreeSet<Integer>>, ArrayList<String[]>>>>>>();
这样一个例子是不是觉得这种方式构建参数化示例优点代码冗余了。所以我们只需要通过静态工厂方法就可以解决这个问题:
public static <K,V> HashMap<K,V> getSelfHashMap(){ return new HashMap<K,V>(); }
这样,我只需要通过如下方式就可以获取实例了,代码要相对简洁不少:
HashMap<String,HashMap<String,ArrayList<LinkedList<TreeMap<HashMap<String,TreeSet<Integer>>,ArrayList<String[]>>>>>> m1 =getSelfHashMap();
正因为这种方式的优点,所以在1.7以及更高版本的JDK中我们就不用想上面那样写过多冗余的代码了。这部分由于版本问题,现在意义不大。