`
hwy1782
  • 浏览: 150010 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

《effective in java》 阅读笔记1 -创建和销毁对象

 
阅读更多

阅读总结。

 

1.用静态工厂方法替代构造器

   优点:

   1.1 静态工厂方法有名称,比较好理解方法的含义。

   1.2 静态工厂可以返回单例对象。

   1.3 静态工厂方法可以返回任何父类型的子类型对象(比如下面的服务提供者框架中展示的)。

   

package effective.java.chapter1;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author E-mail: hwy1782@gmail.com
 * @date  : 2013-2-27 上午10:29:14
 * 
 */
public class Services {
	
	private static final Map<String,Provider> providers = new ConcurrentHashMap<String, Provider>();
	private static final String DEFAULT_PROVIDER_NAME = "<def>";
	
	public static void initProviders(String name,Provider provider){
		providers.put(name, provider);
	}
	
	public static void  initProviders(Provider p) {
		initProviders(DEFAULT_PROVIDER_NAME, p);
	}
	
	public static Service getServiceInstance(String name) {
		Provider p = providers.get(name);
		if(p == null){
			throw new IllegalArgumentException("no provider register with name : "+name);
		}
		return p.provider();
	}
	
	public static Service getServiceInstance(){
		return providers.get(DEFAULT_PROVIDER_NAME).provider();
	}
	
	
}

 

 

 

package effective.java.chapter1;
/**
 * @author E-mail: hwy1782@gmail.com
 * @date  : 2013-2-27 上午10:28:46
 * 
 */
public interface Provider {
	
	Service provider();
	
}

 

package effective.java.chapter1;
/**
 * @author E-mail: hwy1782@gmail.com
 * @date  : 2013-2-27 上午10:28:20
 * 
 */
public interface Service {
	
	void service();
}

 

 

服务提供者框架中存在三个部分:

1.服务提供者(provider):注册服务,需要使用的服务在这个类里面注册。

2.服务接口(service):对外提供的服务,客户端调用这个接口就可以执行相应的服务。

3.服务访问api(services):客户端用来获取服务的实例。

 

1.4 创建参数化实例的时候,代码更简洁:

import com.google.common.collect.Maps;

Map<String,String> maps = Maps.newHashMap();

 

2.构造函数中参数较多的时候,可以考虑使用build模式

package desigenPattern.factory;
/**
 * @author E-mail: hwy1782@gmail.com
 * @date  : 2013-2-21 上午10:35:53
 * 
 * Build 构造器模式
 * 
 * build 构造器模式: 使用内部静态类
 * 
 * 当类的构造器或者静态工厂中有多个参数,采用构造器模式不错
 * 
 */
public class Computer {

	private String name;
	private String type;
	private double screenSize;
	private String produceDate;
	private double price;
	
	public static class Build{
		private String name;
		private String type;
		private double screenSize;
		private String produceDate;
		private double price;
		
		Build(String name,String type){
			this.name = name;
			this.type = type;
		}
		
		public Build screenSize(double size) {
			this.screenSize = size;
			return this;
		}
		
		public Build produceDate(String date) {
			this.produceDate = date;
			return this;
		}
		
		public Build price(double price) {
			this.price = price;
			return this;
		}
		
		public Computer build(){
			return new Computer(this);
		}
		
	}
	
	private Computer(Build build) {
		this.name = build.name;
		this.type = build.type;
		this.screenSize = build.screenSize;
		this.produceDate = build.produceDate;
		this.price = build.price;
	}
	
	@Override
	public String toString() {
		return "[computer name = "+name+" type = "+type+" screenSize = "+screenSize+" price "+
				price+" produceDate "+produceDate+"]";
	}
	
}

 

3.使用私有构造器、或者枚举强化单例属性。

 

4.通过私有构造器,强化不能实例化能力。(比如一些工具类uitl就不需要实例化)

 

5.避免创建不必要的对象。(要优先使用基本类型而不是装箱基本类型,避免无意识的装箱)

 

 

6.消除过期引用:(一般而言只要类自己管理内存就要考虑这个问题)。

 

7.避免使用finalizer方法。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics