`
to_zoe_yang
  • 浏览: 143204 次
  • 性别: 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)和静态...

    Joshua Bloch 所著《Effective Java 第二版》一书的源代码.zip

    Joshua Bloch 所著《Effective Java 第二版》一书的源代码有效的 Java 示例这是 Joshua Bloch 编写的《Effective Java 第二版》一书的来源。除包名称外,其他均未修改。原始源代码可从...

    Joshua Bloch 所著《Effective Java 第二版》一书摘要.zip

    Joshua Bloch 所著《Effective Java 第二版》一书摘要这是我对 Joshua Bloch 所著《Effective Java 第 2 版》的总结。我在学习时会用到它,也可以作为快速参考。它并不是这本书的独立替代品,所以如果你真的想学习...

    effectiveJava的笔记

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

    effective Java(第3版)各章节的中英文学习参考(已完成).zip

    Effective Java 第 3 版 中英双语effective Java(第3版)各章节的中英文学习参考,希望对Java技术的提高有所帮助,欢迎通过issue或pr提出建议和修改意见。目录(Contents)第 2 章 创建和销毁对象(创建和气氛对象...

    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. *...

Global site tag (gtag.js) - Google Analytics