最近学习Android知识,发现Java好多的基础知识运用的真的很一般,所以决定在重新梳理一下,现在Kotlin也来了,在Android之路上,留给我看Java的时间不多了。
静态我们就来简单介绍一下,使用静态工厂方法创建对象相较于构造器创建的对象的优缺点。主要概括如下:
优点:
- 静态工厂方法有名称,可以明确的创建对应功能和属性的Java对象
- 静态工厂方法可以预构建Java对象,实现在必要的情况下创建尽量少的对象实例
- 静态工厂方法可以获取预构建Java对象的任何子类对象
- 静态工厂方法在构建参数化实例的时候,代码更简洁
缺点:
- Java类如果没有公有的或者受保护的构建器,就不能被子类化
- 静态工厂方法和一般静态方法没有任何区别
静态工厂方法与构造器创建Java对象的对比已经介绍完了,下面就来针对优点当中的第一条结合代码说明一下。
1,静态工厂方法优点一
需求:现在有一个需求,就是创建一组值为奇偶数相间的BigInteger数组。
首先来看一下BigInteger的几个构造方法:
BigInteger(byte[] val) 将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger。 |
BigInteger(int signum, byte[] magnitude) 将 BigInteger 的符号-数量表示形式转换为 BigInteger。 |
BigInteger(int bitLength, int certainty, Random rnd) 构造一个随机生成的正 BigInteger,它可能是一个具有指定 bitLength 的素数。 |
BigInteger(int numBits, Random rnd) 构造一个随机生成的 BigInteger,它是在 0 到 (2numBits - 1)(包括)范围内均匀分布的值。 |
BigInteger(String val) 将 BigInteger 的十进制字符串表示形式转换为 BigInteger。 |
BigInteger(String val, int radix) 将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。 |
发现有两个问题:
(1)没有参数对应值为奇数或者偶数对象的构造器
(2)构造器名称一样(无法改变的),对于值为奇数或者偶数的对象无法区分
为了解决上面的问题,我们创建了一个工厂类BigIntegerFactory,其代码如下:
package hfut.com.why;
import java.math.BigInteger;
import java.util.Random;
/**
*
* @author why
*
*/
public class BigIntegerFactory {
/**获取大奇数对象
*
* @param numBits :
* @return
*/
public static BigInteger getOddNum(int numBits) {
BigInteger integer = new BigInteger(numBits, new Random());
if (Integer.parseInt(integer.toString()) % 2 != 0) {
return integer;
} else {
return new BigInteger(String.valueOf(Integer.parseInt(integer.toString()) + 1));
}
}
/** 获取大偶数对象
*
* @param numBits :
* @return
*/
public static BigInteger getEvenNum(int numBits) {
BigInteger integer = new BigInteger(numBits, new Random());
if (Integer.parseInt(integer.toString()) % 2 == 0) {
return integer;
} else {
return new BigInteger(String.valueOf(Integer.parseInt(integer.toString()) + 1));
}
}
}
这样当我们想获取值为偶数或者奇数对象的时候就可以很简单的通过很形象的静态工厂方法获取,比如:
package hfut.com.why;
import java.math.BigInteger;
import java.util.Random;
/**
*
* @author why
*
*
*/
public class TestFactory {
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
System.out.print("获取的奇数为:" + BigIntegerFactory.getOddNum(10).toString() + "\t");
System.out.print(" 获取的偶数为:" + BigIntegerFactory.getEvenNum(10).toString() + "\t");
System.out.println(" 随机获取数值为:" + new BigInteger(10, new Random()).toString());
}
}
}
测试结果如下:
我这个工厂里面为了方便,有一个较明显的错误,就是用Integer对象来解析BigInteger的数据,大家注意一下