第一条.考虑用静态工厂方法代替构造器!
优势:
1.有名称。
BigInteger的probablePrime方法。
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)); }
2.不必每次调用它们的时候都创建一个新对象。
例如BigInteger的valueOf(int i),
public static BigInteger valueOf(long val) { // If -MAX_CONSTANT < val < MAX_CONSTANT, return stashed constant if (val == 0) return ZERO; if (val > 0 && val <= MAX_CONSTANT) return posConst[(int) val]; else if (val < 0 && val >= -MAX_CONSTANT) return negConst[(int) -val]; return new BigInteger(val); }
更好的例子是Boolean的valueOf方法。因为Boolean只会有两个值。并且经常是数值判等。以下两种情况都可以判断相等。
Boolean b1 = Boolean.valueOf(true); Boolean b2 = Boolean.valueOf(true); if(b1.equals(b2)){ System.out.println("equals"); } if(b1==b2){ System.out.println("=="); }
3.可以返回任何子类型的对象。
例如Collections。
4.在创建参数化类型实例的时候,使得代码更简洁。这个还没有实现。但是想法很好!
Map<String, List<String>> m = new HashMap<String, List<String>>();
可以写成
Map<String, List<String>> m = HashMap.newInstance();
其静态工厂方法为:
public static <K, V>HashMap<K, V> newInstance(){
return new HashMap<K, V>();
}
服务提供者框架是指这样一个系统:多个服务提供者实现一个服务,系统为服务提供者的客户端(在类的实现中使用了API的类被称为该API的客户端)提供多个实现,并把它们从多个实现中解耦出来。
服务提供者框架中有三个重要组件:服务接口(Service Interface),由服务提供者实现;提供者注册API(Provider Registration API),这是系统用来注册实现,让客户端访问他们的;服务访问API(Service Access API),是客户端用来获取服务的实例的。
服务提供者框架的第四个组件是可选的:服务提供者接口(Service Provider Interface),这些提供者负责创建其服务实现的实例。如果没有服务提供者接口,实现就按照类名称注册,并通过反射方式进行实例化。
// Service provider framework sketch // Service interface public interface Service{...} // Service provider interface public interface Provider{ Service new Service(); } // Noninstantiable class for service registration and access public class Services{ private Services(){} //禁止实例化 // Maps service names to services private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); public static final String DEFAULT_PROVIDER_NAME = "<def>"; // Provider registration API public static void registerDefaultProvider<Provider p>{ registerProvider(DEFAULT_PROVIDER_NAME, p); } public static void registerProvider(String name, Provider p){ providers.put(name, p); } // Service access API public static Service newInstance(){ return newInstance(DEFAULT_PROVIDER_NAME); } public static Service newInstance(String name){ Provider p = providers.get(name); if(p == null){ throw new IllegalArgumentException("No provider registered with name: " + name); } return p.newService(); } }
对于JDBC来说,Connection就是他的服务接口,DriverManager.registerDriver是提供者注册API,DriverManager.getConnection是服务访问API,Driver就是服务提供者接口。
package ServiceProviderFramework;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Services {
private Services(){
}
private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();
public static final String DEFAULT_PROVIDER = "<def>";
public static void registerDefaultProvider(Provider p){
registerProvider(DEFAULT_PROVIDER, p);
}
public static void registerProvider(String name, Provider p){
providers.put(name, p);
}
public static Service newInstance(){
return newInstance(DEFAULT_PROVIDER);
}
public static Service newInstance(String name){
Provider p = providers.get(name);
if(p==null)
throw new IllegalArgumentException("No provider");
return p.newService();
}
}
package ServiceProviderFramework;
public interface Service {
public void service();
}
package ServiceProviderFramework;
public interface Provider {
Service newService();
}
package ServiceProviderFramework;
class Service1 implements Service{
@Override public void service() {
// TODO Auto-generated method stub
System.out.println("Servide1 is running!");
}
}
package ServiceProviderFramework;
class Service2 implements Service{
@Override public void service() {
// TODO Auto-generated method stub
System.out.println("Servide2 is running!");
}
}
package ServiceProviderFramework;
class Provider1 implements Provider {
private static final Service service = new Service1();
@Override
public Service newService() {
// TODO Auto-generated method stub return service;
return service;
}
}
package ServiceProviderFramework;
class Provider1 implements Provider {
private static final Service service = new Service1();
@Override
public Service newService() {
// TODO Auto-generated method stub return service;
return service;
}
}
package ServiceProviderFramework;
class Provider2 implements Provider {
private static final Service service = new Service2();
@Override
public Service newService() {
// TODO Auto-generated method stub return service;
return service;
}
}
package ServiceProviderFramework;
public class Test {
public static void main(String[] args) {
Provider1 p1 = new Provider1();
Provider2 p2 = new Provider2();
Services.registerDefaultProvider(p1);
Services.registerProvider("Provider2", p2);
Service s1 = Services.newInstance();
Service s2 = Services.newInstance("Provider2");
s1.service();
s2.service();
}
}
分享到:
相关推荐
《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参
java四大名著之一:Effective.Enterprise.Java.中文版 高清pdf 下载
我尽我最大的可能为大家提供了一个最佳实践 —— 《effective java》 第三版。我希望第三版继续满足需求,同时继承前两版的精神。 Small is beautiful, but simple ain’t easy 。 蓝领不是贬低的意思,主要是 ...
Item 85: Prefer alternatives to Java serialization Item 86: Implement Serializable with great caution Item 87: Consider using a custom serialized form Item 88: Write readObject methods defensively ...
java逻辑思维笔试题Effective Java - 第三版笔记 章节索引 02 - 创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 ...
java入门经典书籍,值得一看。
本书一共组织 55 个准则,每一条准则描述一个编写出更好的 c++ 的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论资源管理和模板(templates)运用的两个新章。为反映出现代...
第67条:谨慎地进行优化有三条优化有关的格言是每个人都应该知道的:很多计算上的过失都被归咎于效率(没有达到必要的效率),而不是任何其他的原因 ,甚至包括盲目的做
[Addison-Wesley Professional] Effective C# 改善C#程序的50种方法 第1版 (英文版) [Addison-Wesley Professional] Effective C# 50 Specific Ways to Improve Your C# 1st Edition (E-Book) ☆ 图书概要:☆ C#...
本书一共组织 55 个准则,每一条准则描述一个编写出更好的 C++ 的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论资源管理和模板(templates)运用的两个新章。为反映出现代...
永远不要根据枚举的序数导出与它关联的值,而是要将它保存在一个实例域中:public enum Ensemble {Enum规范中谈及ordinal方法时写道:
下面是用一个传统的for循环遍历集合的例子:用传统的for循环遍历数组的做法如下:这些做法逗比while循环更好,但是它们并不完美。如果真的那么不幸,并且外部集
阅读Effective Java 3 / E,了解如何在编程中使用它以及如何在Swift中使用它。 内容 项目 它总结并组织了每个项目。 我们将在Swift中重写示例代码,并考虑如何在Swift中使用它们。 第2章对象的创建和销毁 项目编号...
包含Core Java,Effective Java,从零开始学Java,Mysql学习教程,Mysql技术内幕,Java经典编程300例,Java核心技术卷1第9版和第10版,Java程序设计经典300例共9本书
《Effective C++:改善程序与设计的55个具体做法》(中文版)(第3版)一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论...
Effective C++中文版(第3版改善程序与设计的55个具体做法)》一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论资源管理...
《Effective Java》:这本书是Java编程的经典参考书,由Java之父Bjarne Stroustrup撰写。它详细介绍了Java编程中的有效实践和最佳实践,如何避免常见的错误和陷阱。 《深入理解Java虚拟机》:这本书是Java虚拟机编程...
第一本推荐的书籍是《Java编程思想》。这本书被广大程序员誉为Java程序设计经典之作。它详细介绍了Java语言的核心概念和基础知识,并通过丰富的实例帮助读者更好地理解和掌握编程技巧。 第二本推荐的书籍是...
java外卖系统源码Effective Java 总结(第 3 版) Bloch、Joshua 和代码示例对 Effective Java 3rd Edition 的说明。 目录 类和接口 第 15 条:最小化类和成员的可访问性 本节回顾封装(信息隐藏) 封装(信息隐藏)...