`

java-创建和销毁对象(二)

阅读更多

第2条:遇到多个构造器参数时要考虑用构造器

静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。

那么有大量可选参数时该如何构造对象呢?

 

第一种方法:重叠构造器(telescope constructer)当你想要创建实例的时候,就利用参数列表最短的构造器,其它的值会赋默认值。

 

public class NutritionFacts {
	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;
	public NutritionFacts(int servingSize, int servings) {
		this(servingSize,servings,0);
	}
	public NutritionFacts(int servingSize, int servings, int calories) {
	    this(servingSize, servings,calories,0);
	}
	public NutritionFacts(int servingSize, int servings, int calories, int fat) {
		this(servingSize,servings,calories,fat,0);
	}
	public NutritionFacts(int servingSize, int servings, int calories, int fat,
			int sodium) {
		this(servingSize,servings,calories,fat,sodium,0);

	}
	public NutritionFacts(int servingSize, int servings, int calories, int fat,
			int sodium, int carbohydrate) {
		super();
		this.servingSize = servingSize;
		this.servings = servings;
		this.calories = calories;
		this.fat = fat;
		this.sodium = sodium;
		this.carbohydrate = carbohydrate;
	}
	
}

 

缺点:如果参数多了的话,就失去了控制。

 

第2中:JavaBean模式。

 

public class NutritionFacts {
	
	private int servingSize=-1;
	private int servings=-1;
	private int calories=0;
	private int fat=0;
	private int sodium=0;
	private int carbohydrate=0;
	public int getServingSize() {
		return servingSize;
	}
	public void setServingSize(int servingSize) {
		this.servingSize = servingSize;
	}
	public int getServings() {
		return servings;
	}
	public void setServings(int servings) {
		this.servings = servings;
	}
	public int getCalories() {
		return calories;
	}
	public void setCalories(int calories) {
		this.calories = calories;
	}
	public int getFat() {
		return fat;
	}
	public void setFat(int fat) {
		this.fat = fat;
	}
	public int getSodium() {
		return sodium;
	}
	public void setSodium(int sodium) {
		this.sodium = sodium;
	}
	public int getCarbohydrate() {
		return carbohydrate;
	}
	public void setCarbohydrate(int carbohydrate) {
		this.carbohydrate = carbohydrate;
	}
}
/***客服端代码**/
public static void main(String[] args) {
		NutritionFacts cocaCola=new NutritionFacts();
		cocaCola.setServingSize(240);
		cocaCola.setServings(8);
		cocaCola.setCalories(100);
		
}

 

缺点:构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。

 

第3种  Builder模式。

 

public class NutritionFacts {
	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;
	
	/**
	 * 静态内部类
	 * @author weix
	 *
	 */
	public static class Builder{
		private final int servingSize;
		private final int servings;
		private  int calories=0;
		private  int fat=0;
		private  int sodium=0;
		private  int carbohydrate=0;
		
		public Builder(int servingSize, int servings) {
			this.servingSize = servingSize;
			this.servings = servings;
		}
		
		public Builder calories(int val){
			calories=val;
			return this;
		}
		public Builder fat(int val){
			fat=val;
			return this;
		}
		public Builder carbohydrate(int val){
			carbohydrate=val;
			return this;
		}
		public Builder sodium(int val){
			sodium=val;
			return this;
		}
		
		public NutritionFacts build(){
			return new NutritionFacts(this);
		}

		
	}
	
	public NutritionFacts(Builder builder) {
		this.servingSize=builder.servingSize;
		this.servings=builder.servings;
		this.calories=builder.calories;
		this.fat=builder.fat;
		this.sodium=builder.sodium;
		this.carbohydrate=builder.carbohydrate;
	}
/****客户端****/
	public static void main(String[] args) {
		NutritionFacts cocaCola=new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
	}

}

 

缺点:为了创建对象,必须先创建他的构造器,在十分注重性能的情况下,可能成问题。比重叠构造器模式更加冗长,因此他只在有很多参数的时候才使用4个或者更多。

 

0
0
分享到:
评论

相关推荐

    mysql-connector-java-5.1.37-jar

    这些连接池会在应用启动时预创建一定数量的数据库连接,并在空闲时回收,从而减少连接创建和销毁的开销。 在Java应用部署时,确保正确配置了数据库连接参数,例如URL、用户名和密码。对于生产环境,还需要考虑负载...

    mysql-connector-java-8.0.11

    - 使用连接池管理数据库连接,避免频繁创建和销毁连接。 - 配置合适的超时时间,防止长时间占用数据库资源。 总的来说,"mysql-connector-java-8.0.11"是Java开发者连接MySQL 8.0.11数据库的重要工具,其稳定性和...

    mysql-connector-java-5.1.46.jar

    它们管理数据库连接,避免频繁创建和销毁连接,提升系统效率。 8. **安全性** 对于敏感的数据库连接信息,如用户名和密码,应避免硬编码在代码中,而是使用环境变量、配置文件或者密钥管理服务存储。 9. **兼容性...

    mysql-connector-java-gpl-5.1.36

    8. **连接池**:在实际应用中,为了提高性能和资源利用率,通常会使用连接池(如C3P0、HikariCP或Apache DBCP),它管理数据库连接的生命周期,避免频繁创建和销毁连接。 9. **异常处理**:在使用JDBC时,需要妥善...

    mysql-connector-java-8.0.15.jar

    这些连接池库可以复用已建立的连接,减少创建和销毁连接的开销,提高应用性能。 9. **安全性**: 这个版本的驱动可能加强了安全性,支持更安全的认证方法,如SSL连接,以及对新的MySQL身份验证插件的支持。 10. **...

    JAVA创建和销毁对象的方法

    在Java编程中,创建和销毁对象是至关重要的操作,它们直接影响到程序的性能和内存管理。本文将深入探讨Java中创建对象的几种方法以及对象的销毁。 首先,我们来看看创建对象的基本方式——构造器。构造器是每个类都...

    mchange-commons-java-0.2.11.jar

    这个库的核心功能是提供一个高效、灵活的数据库连接池,使得应用程序在处理数据库操作时可以更高效地管理和重用数据库连接,避免了频繁创建和销毁连接带来的性能开销。 C3P0连接池的主要特点包括: 1. **连接自动...

    mysql-connector-java-5.1.38.jar

    - 在实际应用中,为了提高性能和资源利用率,通常使用连接池(如C3P0、HikariCP、Apache DBCP等),它们管理数据库连接的生命周期,避免频繁创建和销毁连接。 8. **版本兼容性**: - `mysql-connector-java-...

    tomcat-redis-session-manager-1.2-tomcat-7-java-7

    通过预先创建并维护一定数量的对象,可以避免频繁创建和销毁对象的开销,提高程序效率。 4. **Jedis客户端**:Jedis提供了丰富的操作Redis的方法,包括基本的set、get、del等命令,以及事务处理、发布订阅等功能。...

    Java 中的一个文件临时创建和销毁的例子

    这个方法接受两个参数:前缀和后缀,返回一个`File`对象表示新创建的临时文件。例如: ```java import java.io.File; import java.io.IOException; public class TempFileExample { public void createTempFile()...

    mysql 连接驱动 mysql-connector-java-5.1.46.jar

    此外,了解如何配置连接池(如C3P0、HikariCP或Apache DBCP)也是提高应用性能的关键,连接池能有效管理和复用数据库连接,减少创建和销毁连接的开销。 总之,`mysql-connector-java-5.1.46.jar`是Java开发者与...

    java性能调优-jvm创建对象和-performance-createobj-allocationmemory.zip

    1. **对象池技术**:对于频繁创建和销毁的对象,可以使用对象池避免频繁的内存分配和回收。 2. **减少对象创建**:尽量复用对象,减少不必要的new操作,例如使用StringBuilder而非String进行字符串拼接。 3. **...

    commons-pool和commons-dbcp数据源jar包(2个)和mysql驱动包mysql-connector-java-5.0.4-bin(1个)

    总结起来,Apache Commons Pool和DBCP是Java数据库连接池的优秀实现,它们通过对象池化策略减少了数据库连接的创建和销毁开销。而MySQL Connector/J作为JDBC驱动,是Java应用连接MySQL数据库不可或缺的部分。在实际...

    Java中对象的销毁方法分析

    在Java编程语言中,对象的生命周期和销毁是一个关键的概念,它涉及到内存管理和性能优化。下面我们将详细讨论Java中对象的创建、使用以及销毁的过程。 首先,对象的创建通常通过`new`关键字完成,这会在堆内存中...

    mysql-connector-java-5.0.8

    在实际开发中,`mysql-connector-java-5.0.8`还涉及到性能优化,例如设置合适的连接池,以减少数据库连接的创建和销毁开销。同时,对于大数据量的操作,可以使用批量插入和批量更新来提升效率。 总之,`mysql-...

    java逻辑思维笔试题-effective-java-3rd-edition:有效的Java第3版注释

    创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 12 - 序列化 第 2 章 - 创建和销毁对象 第 1 项 - 考虑静态工厂...

    基于Java的源码-存储与读取对象.zip

    在大量创建和销毁对象的应用中,可以使用对象池或缓存来提高性能。例如,`java.util.concurrent`包下的`ConcurrentHashMap`可以作为简单的对象缓存。 8. JSON序列化 除了二进制序列化,Java还可以使用如Jackson或...

    Java--pool-technology.rar_theory

    Java对象池技术是一种优化资源管理的方法,主要用于减少创建和销毁对象的开销,尤其是在频繁创建和销毁对象的应用场景中。其基本思想是预先创建并维护一组可重用的对象,当程序需要一个对象时,可以从池中获取,而...

    Java零基础-对象的创建和使用-内存分析.md

    ### Java零基础-对象的创建和使用-内存分析 #### 知识点一:对象的创建 在Java中,对象的创建是通过`new`关键字完成的。对象创建的两个主要步骤包括分配内存和初始化对象。 1. **分配内存**:当使用`new`关键字时...

    java-design-patterns.zip

    这在需要频繁创建和销毁对象,或者对象创建代价高昂时特别有用,例如线程池或缓存服务。 2. **工厂方法模式**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。它将对象的实例化过程...

Global site tag (gtag.js) - Google Analytics