`
to_zoe_yang
  • 浏览: 142315 次
  • 性别: 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();
	}
}

 

 

 

 


 

 

分享到:
评论

相关推荐

    Effective Java第三版1

    ### 第一章 介绍 这一章通常会介绍本书的主题和目标,以及对读者的期望。在Effective Java中,作者可能会讨论最佳实践的重要性,以及遵循这些实践如何提升代码质量。 ### 第二章 创建和销毁对象 这一章深入探讨了...

    Effective Java读书笔记.pdf

    Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展可追溯到1991年,当时由...

    effective-java.pdf

    标题“effective-java.pdf”与描述“effective-java.pdf”表明本文档是关于Java编程实践的指南,且内容可能来自于一本名为《Effective Java》的书籍,该书是由Joshua Bloch编写,被广泛认为是Java编程的权威指南。...

    Effective.Enterprise.Java.中文版 高清pdf 下载

    《Effective Enterprise Java》是Java开发领域的一本经典著作,由著名技术专家Bill Venners编著,被广大Java开发者誉为“四大名著”之一。这本书深入探讨了在企业级Java开发中如何写出高效、可维护和易于理解的代码...

    Effective Java.zip

    《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...

    Effective Java 第三版

    《Effective Java 第三版》是由Joshua Bloch所著的一本关于Java编程的书籍,旨在向Java开发者传授编写高效、健壮、可靠的Java代码的最佳实践。书中分为多个章节,每一章节都详细介绍了Java语言中的一个特定主题,并...

    Effective Java 3rd edition(Effective 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 ...

    effecctivejava 第三版中文

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,现在已经更新到第三版。这本书深入探讨了如何编写高效、可维护且设计良好的Java代码,是每一个Java开发者提升技能的重要参考资料。以下是对该...

    Effective-Java:Effective Java中文版第二版示例代码

    这里我们将围绕"Effective-Java:Effective Java中文版第二版示例代码"这一主题,深入探讨书中的核心知识点。 1. **单例模式**:书中提倡使用`enum`实现单例,避免传统双重检查锁定(Double-Checked Locking)和静态...

    effectiveJava的笔记

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...

    Effective Java 软件翻译.rar

    我尽我最大的可能为大家提供了一个最佳实践 —— 《effective java》 第三版。我希望第三版继续满足需求,同时继承前两版的精神。 Small is beautiful, but simple ain’t easy 。 蓝领不是贬低的意思,主要是 ...

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,第二版发布于2008年。这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. *...

    java effective 第二版中英文二份文件

    第二版在第一版的基础上进行了更新,以适应Java语言的新特性和发展。以下是基于书中的核心知识点的详细阐述: 1. **接口优先于继承**:书中强调,继承是实现多态的一种方式,但过度使用可能会导致类层次结构过于...

    1_Effective_Java_2nd_Edition_proglib_java_Joshua_

    1. **项规则与实践**:书中提出了许多编程最佳实践,每一条都被称为“项”,如“始终使用接口引用对象”、“避免在public API中使用可变字段”等,这些项都是经过实战验证的编程智慧。 2. **枚举类型**:Bloch强调...

Global site tag (gtag.js) - Google Analytics