第一条.考虑用静态工厂方法代替构造器!
优势:
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中,作者可能会讨论最佳实践的重要性,以及遵循这些实践如何提升代码质量。 ### 第二章 创建和销毁对象 这一章深入探讨了...
Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展可追溯到1991年,当时由...
标题“effective-java.pdf”与描述“effective-java.pdf”表明本文档是关于Java编程实践的指南,且内容可能来自于一本名为《Effective Java》的书籍,该书是由Joshua Bloch编写,被广泛认为是Java编程的权威指南。...
《Effective Enterprise Java》是Java开发领域的一本经典著作,由著名技术专家Bill Venners编著,被广大Java开发者誉为“四大名著”之一。这本书深入探讨了在企业级Java开发中如何写出高效、可维护和易于理解的代码...
《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...
《Effective Java 第三版》是由Joshua Bloch所著的一本关于Java编程的书籍,旨在向Java开发者传授编写高效、健壮、可靠的Java代码的最佳实践。书中分为多个章节,每一章节都详细介绍了Java语言中的一个特定主题,并...
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 ...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,现在已经更新到第三版。这本书深入探讨了如何编写高效、可维护且设计良好的Java代码,是每一个Java开发者提升技能的重要参考资料。以下是对该...
这里我们将围绕"Effective-Java:Effective Java中文版第二版示例代码"这一主题,深入探讨书中的核心知识点。 1. **单例模式**:书中提倡使用`enum`实现单例,避免传统双重检查锁定(Double-Checked Locking)和静态...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...
我尽我最大的可能为大家提供了一个最佳实践 —— 《effective java》 第三版。我希望第三版继续满足需求,同时继承前两版的精神。 Small is beautiful, but simple ain’t easy 。 蓝领不是贬低的意思,主要是 ...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,第二版发布于2008年。这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. *...
第二版在第一版的基础上进行了更新,以适应Java语言的新特性和发展。以下是基于书中的核心知识点的详细阐述: 1. **接口优先于继承**:书中强调,继承是实现多态的一种方式,但过度使用可能会导致类层次结构过于...
1. **项规则与实践**:书中提出了许多编程最佳实践,每一条都被称为“项”,如“始终使用接口引用对象”、“避免在public API中使用可变字段”等,这些项都是经过实战验证的编程智慧。 2. **枚举类型**:Bloch强调...