文档章节

Article-No.01 Effective Java

蓝汀华韶
 蓝汀华韶
发布于 2014/09/19 10:49
字数 873
阅读 41
收藏 0

第2章 创建和销毁对象

1、考虑用静态工厂方法代替构造器

public static Boolean valueOf(boolean paramBoolean) {
    return ((paramBoolean) ? TRUE : FALSE);
}

1)静态工厂方法与构造器不同的优势:

  • 它们有名称,可以见名知意,当一个类需要多个带有相同签名的构造器时,就用静态工厂方法替代构造器,并选择其名称加以区别

  • 不必每次调用它们的时候都创建一个新对象,单例模式实现(判断两个对象是否相等的时候,可以直接用==代替equals()提高性能)

  • 可以返回原返回类型的任何子类型对象

public interface Type {
    public void add(Type type);
    public void delete(int typeId);
    public void update(Type type);
    public Type query(int typeId);
}
/**
 * Type工具类
 * @author admin
 *
 */
public class Types {
    private Types() {
    }
 
    public static Type getType() {
        return new TypeImpl() ;
    }
}

2)静态工厂方法的特点是每次被调用的时候,不一定会返回一个新的实例,利用这一特点,静态工厂方法可以用于创建一下实例:

  • 单例类:只有唯一的实例对象

  • 枚举类:实例数量有限的类

  • 具有实例缓存的类:能将已经创建的实例暂且存放在缓存中的类

  • 具有实例缓存的不可变类:不可变的实例一旦创建,其属性就不会发生改变

3)静态工厂方法缺点:

  • 类如果被定义为私有的构造器,则不能被子类化

  • 静态工厂方法和其他静态方法没有明显区别,用户难以识别哪些静态方法是用来返回类实例的,为了减少这一缺点带来的负面影响,可以在为静态工厂方法命名时尽量遵守约定俗成的规范,当然这不是必需的。

    1)valueOf:该方法返回的实例与它的参数具有相同的值,这样的类工厂方法实际上类型转换方法

    2)of:代替valueOf,在EnumSet中使用

    3)getInstance:返回相同的实例对象

    4)newInstance:返回不同的实例对象

    5)getType:和getInstance相同,但是在静态工厂方法处于不同的类型返回值使用

    6)newType:和newInstance相同,但是在静态工厂方法处于不同的类型返回值使用

2、遇到多个构造器参数时要考虑用构建器

1)多个构造器参数时,可以采用Builder模式,Builder模式模拟了具有多个可选参数

package cn.guagua.mobile.common.http;

import java.util.Map;

/**
 * 主播信息参数实体类
 * @author shma
 * @date 2014-10-16 11:15:00
 *
 */
public class HttpEntity {

	private String url;
	private String entityName;
	private Map<String, Object> paramMap;
	private REUQEST_TYPE requestType; // 0 : get, 1 : post
	private REQUEST_SERVICE reqService;
	private Map<String, String> header;
	private int timeout;
	
	public enum REUQEST_TYPE {
		GET,
		POST
	};
	
	public enum REQUEST_SERVICE {
		SYNCH,       //同步
		ASYNCH       //异步
	};
	
	private HttpEntity(Builder builder) {
		url = builder.url;
		entityName = builder.entityName;
		paramMap = builder.paramMap;
		requestType = builder.requestType;
		reqService = builder.reqService;
		header = builder.header;
		timeout = builder.timeout;
	}  
	
	public String getUrl() {
		return url;
	}

	public String getEntityName() {
		return entityName;
	}

	public Map<String, Object> getParamMap() {
		return paramMap;
	}

	public REUQEST_TYPE getRequestType() {
		return requestType;
	}

	public REQUEST_SERVICE getReqService() {
		return reqService;
	}

	public Map<String, String> getHeader() {
		return header;
	}

	public int getTimeout() {
		return timeout;
	}

	public static class Builder {
		protected String url;
		protected String entityName;
		protected Map<String, Object> paramMap;
		protected REUQEST_TYPE requestType; // 0 : get, 1 : post
		protected REQUEST_SERVICE reqService;
		protected Map<String, String> header;
		protected int timeout;
		
		public Builder() {
			
		}
		
		public Builder setUrl(String url) {
			this.url = url;
			return this;
		}
		
		public Builder setEntityName(String entityName) {
			this.entityName = entityName;
			return this;
		}
		
		public Builder setParamMap(Map<String, Object> paramMap) {
			this.paramMap = paramMap;
			return this;
		}
		
		public Builder setRequestType(REUQEST_TYPE requestType) {
			this.requestType = requestType;
			return this;
		}

		public Builder setReqService(REQUEST_SERVICE reqService) {
			this.reqService = reqService;
			return this;
		}

		public Builder setHeader(Map<String, String> header) {
			this.header = header;
			return this;
		}

		public Builder setTimeout(int timeout) {
			this.timeout = timeout;
			return this;
		}

		public HttpEntity build() {
			return new HttpEntity(this);
		}
	}
}

2)

© 著作权归作者所有

共有 人打赏支持
蓝汀华韶
粉丝 36
博文 77
码字总数 80082
作品 0
海淀
程序员
私信 提问
Java各阶段学习书目

1. 入门: 高永强的《Java编程艺术》 2. 提高 Bruce Eckel的《Thinking in Java》 3. 进阶 Joshua Bloch的《Effective Java》 Joshua Bloch的《Java Puzzlers》 4. 全面 Cay S. Horstman的《...

晨曦之光
2012/04/24
127
0
那些年,关于 Java 的那些事儿

版权声明:Follow your heart and intuition. https://blog.csdn.net/qq_35246620/article/details/78695893 温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,...

维C果糖
2017/12/02
0
0
Java 书籍 Top 10

陈皓 http:// blog.csdn.net/haoel 下面是Java Inside上推荐的十本Java书籍(文章来源),我把中文版的也列了出来。 1)Java Language Specification, Third Edition (by James Gosling) 本书...

JavaGG
2009/09/21
12.5K
20
Effective Go 中英双语版

Effective Go - 《实效 GO 编程》 Introduction Go is a new language. Although it borrows ideas from existing languages, it has unusual properties that make effective Go programs ......

兵戈天下
2016/08/13
895
3
Java粗浅认识-java简介

简介 java 是1991年是为了交互式电视设计,sun公司在1996年发布java1.0版本,java的特点是“一次编译,到处执行”,借助于 在浏览器上可执行java apple,渐渐流行起来,在1999年发布java1.2...

zoQ
2018/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot项目如何访问jsp页面

1.添加pom依赖 首先在原来的pom文件基础上加上这两个配置 如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:7877071...

编程SHA
7分钟前
0
0
nginx反向代理配置去除前缀

使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法: 方法一:...

架构师springboot
40分钟前
2
0
QianBill API 开发笔记

JWT

BeanHo
51分钟前
3
0
Elasticsearch实战篇——Spring Boot整合ElasticSearch

当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来探讨Spring Boot整合ElasticSearch的问题。 本文主要讲以下内容: 第一部分,通...

JAVA_冯文议
今天
3
0
不错的linux下通用的java程序启动脚本

#!/bin/sh#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,#也可以作为启动java程序的独立脚本来使用。##Author: tudaxia.com, Date: 2011/6/7...

sprouting
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部