# effective java观后感(1)-------用静态方法代替构造方法

121人阅读 评论(1)

Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例:

• 公有的构造器
• 提供静态工厂方法(static factory method)

public static BigInteger probablePrime(int bitLength, Random rnd) {
if (bitLength < 2)
throw new ArithmeticException("bitLength < 2");

// The cutoff of 95 was chosen empirically for best performance
return (bitLength < SMALL_PRIME_THRESHOLD ?
smallPrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd) :
largePrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd));
}


private static BigInteger largePrime(int bitLength, int certainty, Random rnd) {
BigInteger p;
p = new BigInteger(bitLength, rnd).setBit(bitLength-1);
p.mag[p.mag.length-1] &= 0xfffffffe;

// Use a sieve length likely to contain the next prime number
int searchLen = (bitLength / 20) * 64;
BitSieve searchSieve = new BitSieve(p, searchLen);
BigInteger candidate = searchSieve.retrieve(p, certainty, rnd);

while ((candidate == null) || (candidate.bitLength() != bitLength)) {
if (p.bitLength() != bitLength)
p = new BigInteger(bitLength, rnd).setBit(bitLength-1);
p.mag[p.mag.length-1] &= 0xfffffffe;
searchSieve = new BitSieve(p, searchLen);
candidate = searchSieve.retrieve(p, certainty, rnd);
}
return candidate;
}


public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}


/**
* Creates an empty enum set with the specified element type.
*
* @param elementType the class object of the element type for this enum
*     set
* @throws NullPointerException if <tt>elementType</tt> is null
*/
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");

if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}


public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}


Map<String,List<Integer>> n = newInstance();


Map<String,List<Integer>> m = new HashMap<String,List<Integer>>();


• 类如果不含公有或者受保护的构造器就不能被子类化。
所以上面说的静态工厂方法可以返回原返回类型的子类型对象。并不完全正确。
虽然我们可以通过复合方式(composition)解决这一问题，但这样两个类就不是is-a关系了。
• 静态工厂方法的本质还是静态方法，他没有一个特别的标准。
我们无法在API文档中把一个静态工厂方法特别标识出来(也许可以加个标准annotation?)。
当我要从API中找一个方法去实例化一个类时，相对构造器而言还是不够直观。
虽然没有特个特别的标准，但我们也可以用标准的命名来弥补一点点。
比如valueOf,getInstance,newInstance,newType等...

0
0

【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐（算法+实战）--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：9952次
• 积分：388
• 等级：
• 排名：千里之外
• 原创：29篇
• 转载：6篇
• 译文：0篇
• 评论：1条
阅读排行
最新评论