`

使用静态内部类实现builder模式

阅读更多

项目中有个参数特别多的实体类,每次new一个对象都特别怕弄错,于是就有了下面示例的解决方式

/**
 * @author quainter
 */
public class Person {
	
	/**
	 * 私有化默认构造方法,
	 * 不希望使用这种方法构造,
	 * 索性就不让别人用,
	 * 算是个好习惯吧
	 */
	private Person(){}
	
	//必填实例化参数
	private String name;
	//可选实例化参数
	private int sex;
	private int age;
	private String favor;
	
	//使用静态内部类实例化Person构造器
	private Person(Builder builder){
		this.name=builder.name;
		this.age=builder.age;
		this.sex=builder.sex;
		this.favor=builder.favor;
	}
	
	/**
	 * 静态内部构造器类(主角)
	 * @author quainter
	 */
	public static class Builder{

		private String name;
		private int sex;
		private int age;
		private String favor;
		
		public Builder(String name){
			this.name=name;
		}
		
		public Builder sex(int sex){
			this.sex=sex;
			return this;
		}
		
		public Builder age(int age){
			this.age=age;
			return this;
		}
		
		public Builder favor(String favor){
			this.favor=favor;
			return this;
		}
		public Person build(){
			return new Person(this);
		}
	}

	/**
	 * getters and setters
	 */
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getSex() {
		return sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getFavor() {
		return favor;
	}

	public void setFavor(String favor) {
		this.favor = favor;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + ", age=" + age
				+ ", favor=" + favor + "]";
	}
	
}

 

public class Test {

	public static void main(String[] args) {
		Person person = new Person.Builder("张三").age(17).favor("吃").sex(1).build();
		System.out.println(person);
	}

}

 运行结果:
   

 

OK,每天进步一点点!
 

  • 大小: 4 KB
分享到:
评论

相关推荐

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    Java经典编程源码基础例程300.zip

    实例069 静态内部类的简单应用 105 实例070 实例化Class类的几种方式 107 实例071 查看类的声明 108 实例072 查看类的成员 110 实例073 查看内部类信息 112 实例074 动态设置类的私有域 113 实例075 动态调用类中...

    酒店管理客房系统Java源码-GOF23:Java实现23种设计模式学习笔记

    静态内部类式(线程安全,调用效率高。但是可以延时加载) 枚举单例(线程安全,调用效率高,不能延时加载) : 简单工厂模式:用来生产同一等级结构中的任意产品(对已有产品新增功能,需要修改源代码)虽然能通过...

    asp.net知识库

    使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的...

    vc++ 应用源码包_1

    使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一...

    vc++ 应用源码包_2

    使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一...

    vc++ 应用源码包_6

    使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一...

    vc++ 应用源码包_5

    使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一...

    vc++ 应用源码包_3

    使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一...

    java 面试题 总结

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    超级有影响力霸气的Java面试题大全文档

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    jaxb2-rich-contract-plugin:实现一些JAXB插件以从XSD生成高级合同方案

    构建器作为内部类实现,为流畅的构建器模式提供静态方法,形式为MyClass.builder().withPropertyA(...).withPropertyB(...).build() 。 生成器还包含“ copy ...”方法,用于从另一个实例初始化生成器。 还支持与...

    vc++ 开发实例源码包

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    数据库基础

    §8.1.3 DECODE实现表的转置 189 §8.2 关于访问远程数据库 192 §8.2.1 数据库链接 192 §8.2.2 使用同义词获得本地透明 193 §8.2.3 在视图中使用user伪列 194 §8.2.4 使用COPY功能 195 §8.2.5 管理Oracle名称...

    java面试800题

    factory工厂模式、prototype原始模型模式、singleton单例模式、builder建造模式 结构模式 facade门面模式、proxy代理模式、adapter适配器(变压器)模式、composite合成模式、decorator装饰模式、bridge桥梁模式、...

    proto-registry:Protobuf注册中心API的实现

    它在Spotify内部用于为gRPC服务的API文档提供支持。 演示版 一个测试实例托管在Netlify上,为 。 请注意,此实例仅托管文档,并且不会正确处理请求,因为Netlify仅提供静态HTML页面的托管。 Docker镜像 该存储库将...

    Oracle8i_9i数据库基础

    §8.1.3 DECODE实现表的转置 189 §8.2 关于访问远程数据库 192 §8.2.1 数据库链接 192 §8.2.2 使用同义词获得本地透明 193 §8.2.3 在视图中使用user伪列 194 §8.2.4 使用COPY功能 195 §8.2.5 管理Oracle名称...

    Visual Basic 6编程技术大全 中译本扫描版带书签 2/2

    8.2.3 Query Builder窗口288 8.3 ADO数据绑定289 8.3.1绑定机制290 8.3.2使用绑定控件292 8.3.3 ADO Data控件293 8.3.4格式化数据295 8.3.5 DataForm Wizard299 8.4 DataEnvironment设计器300 8.4.1 Connection对象...

    Visual Basic 6编程技术大全 中译本扫描版带书签 1/2

    8.2.3 Query Builder窗口288 8.3 ADO数据绑定289 8.3.1绑定机制290 8.3.2使用绑定控件292 8.3.3 ADO Data控件293 8.3.4格式化数据295 8.3.5 DataForm Wizard299 8.4 DataEnvironment设计器300 8.4.1 Connection对象...

    复旦nois教材01.rar

    2.2.2 开始使用SOPC Builder........................................................................................11 2.2.3 系统主频........................................................................

Global site tag (gtag.js) - Google Analytics