最近学习Android知识,发现Java好多的基础知识运用的真的很一般,所以决定在重新梳理一下,现在Kotlin也来了,在Android之路上,留给我看Java的时间不多了。
静态我们就来简单介绍一下,使用静态工厂方法创建对象相较于构造器创建的对象的优缺点。主要概括如下:
优点:
- 静态工厂方法有名称,可以明确的创建对应功能和属性的Java对象
- 静态工厂方法可以预构建Java对象,实现在必要的情况下创建尽量少的对象实例
- 静态工厂方法可以获取预构建Java对象的任何子类对象
- 静态工厂方法在构建参数化实例的时候,代码更简洁
缺点:
- Java类如果没有公有的或者受保护的构建器,就不能被子类化
- 静态工厂方法和一般静态方法没有任何区别
静态工厂方法与构造器创建Java对象的对比已经介绍完了,静态就来介绍一下使用静态工厂方法创建对象的缺点,以及我们常常使用的一些静态工厂方法的名称。
1,静态工厂方法创建对象缺点
1.1 类如果不含有公共的或者受保护的构造器,就不能被子类化
这句话与我们上面总结介绍的优点三是相悖的。其实就是这一句话
1.2 它们在形式上和普通的静态方法没有任何区别
这样就面临一个问题,如果一个类提供了静态方法构建该类的实例对象但是没有API的话,我们很难找到究竟该如何实例化一个该类的对象。
2,常见的用于构建对象的静态工厂方法名称
(1)valueOf()
这个大家一定不陌生,因为我们平时用的实在是太多了。最常见的就是几个基本类型封装起来的类,比如Integer,Float等:
static Integer |
valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。 |
static Integer |
valueOf(String s) 返回保存指定的 String 的值的 Integer 对象。 |
static Integer |
valueOf(String s, int radix) 返回一个 Integer 对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值。 |
static Float |
valueOf(float f) 返回表示指定的 float 值的 Float 实例。 |
static Float |
valueOf(String s) 返回保存用参数字符串 s 表示的 float 值的 Float 对象。 |
(2)of(),一种valueOf()简写
比如EnumSet:
static
|
of(E e) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E first, E... rest) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E e1, E e2) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E e1, E e2, E e3) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E e1, E e2, E e3, E e4) 创建一个最初包含指定元素的枚举 set。 |
|
static
|
of(E e1, E e2, E e3, E e4, E e5) 创建一个最初包含指定元素的枚举 set。 |
(3)getInstance(),返回的对象通过方法的参数来描述,对于Singleton来说,就没有参数
(4)newInstance(),和上面一样,但是它的特点是可以保证每次返回的对象都不同
(5)getType(),和(3)一样,通常在工厂方法不在本类中的时候使用,Type表示工厂方法锁返回的对象类型
(6)newType(),和(4)一样,通常在工厂方法不在本类中的时候使用,Type表示工厂方法锁返回的对象类型
其中(5)和(6)可以会看我在优点一举的例子,就是通过这样的方式获取的实例。对于(3)和(4)我这里也可以很快的举一个例子,可以参考一下。
package hfut.com.why; public class ConstantStringFactory { private String description; private int id; private static ConstantStringFactory cstr = new ConstantStringFactory("this is a constant string"); public ConstantStringFactory() { } public ConstantStringFactory(String str) { // TODO Auto-generated constructor stub this.description = str; } public ConstantStringFactory(String str, int id) { // TODO Auto-generated constructor stub this.description = str; this.id = id; } // 获取实例--单例模式Singleton,当构造器权威私有的时候 public static ConstantStringFactory getInstance() { return cstr; } // 依据参数获取实例1 public static ConstantStringFactory getInstance(String str) { return new ConstantStringFactory(str); } // 依据参数获取实例2 public static ConstantStringFactory getInstance(String str, int id) { return new ConstantStringFactory(str, id); } // 每次创建不同的实例对象 public static ConstantStringFactory newInstance() { return new ConstantStringFactory(); } @Override public String toString() { // TODO Auto-generated method stub return description; } @Override public boolean equals(Object arg0) { // TODO Auto-generated method stub return this.toString().equals(arg0.toString()); } }