`
to_zoe_yang
  • 浏览: 138949 次
  • 性别: Icon_minigender_2
  • 来自: 01
社区版块
存档分类
最新评论

Effective java 第一条

 
阅读更多

第一条.考虑用静态工厂方法代替构造器!

 

优势:

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();
	}
}

 

 

 

 


 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics