【Java】【TIJ】让类的对象个数受控于我们——实现类对象个数的限制(完善版)


    在上一篇中,我给大家介绍了一个控制类对象个数的实现方式(见链接:http://blog.csdn.net/wolfofsiberian/article/details/39856367)但是考虑到,这个程序实现的是不够完善的。因为,我们可以想到,在实际使用过程中,Connection对象在用户使用的过程中,当用户先申请到了,然后再释放连接的时候。这个释放的过程是个随机的,比如说:当释放的连接对象时connArray[3]时候,这个时候,类应该对connArray[3]这个位置进行回收,如果用户释放connArray[4]连接时候,类也需要对其进行回收,以便后面其他用户申请的时候给它们分配。


问题描述

     创建一个名为ConnectionManager的类,该类管理一个元素为Connection对象的固定数组。客户端程序员不能直接创建Connection对象,而只能通过ConnectionManager中的某个static的方法来获取它们。当ConnectionManager之中不再有对象时,它会返回null引用。在main()之中检测这些类。(这里ConnectionManager替换为下面的ConnectionManagerEnhence)


具体的实现思路如下:

<pre name="code" class="java">/**
* Thinking in Java test 6.8(限制类对象个数)完善版
* @author:WolfOfSiberian
* @email:QuietWolf@yeah.net
*/
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;


public class ConnectionManagerEnhence{
        //最大连接数
	private static final int connMax = 10;
	//Connection对象静态数组
	private static Connection connArray[] = new Connection[connMax];
	//当前使用的连接数
	private static int countUse = 0;
	
	/**
	* 构造方法私有化
	*/
	private ConnectionManagerEnhence(){
		//
	}

	/**
	*  获取可用的Connection对象数组的下标 
	* @return 返回可以新建Connection对象的静态数组的下标索引,如果没有可用下标索引,则返回-1。
	*/
	private static int getAvailable(){
		for(int i=0;i<connMax;i++){
			if(null == connArray[i]){
				return i;
			}
		}
		return -1;
	}
	/**
	*  获取Connection对象
	* @return 返回新建的的Connection对象
	*/
	public static Connection getConnection()throws Exception{
		if(countUse >= connMax){
			System.out.println("Sorry,There is no Connection Object for you to use!");

			return null;
		}
		else
		{
                        Class.forName("com.mysql.jdbc.Driver").newInstance();//加载连接MySQL数据库的驱动程序
			int availableIndex = getAvailable();//获取可用的Connection对象数组下标
			//System.out.print(" " +availableIndex+" ");
		        connArray[availableIndex] = DriverManager.getConnection("jdbc:mysql://localhost/test?"+"user=root&password=sine88");//获取连接对象Connection
		       
			countUse++;//使用连接数加一,可用的连接数却少了一个
			System.out.println("分配1个Connection对象:index="+availableIndex+"当前在线连接数:"+countUse+",当前可用连接数:"+(connMax - countUse));

		    	return connArray[availableIndex];
		}

	}
	
	/**
	* 释放指定Connection对象
	* @param conn    需要被释放的连接
	*/
	public static void freeConnection(Connection conn)throws Exception{
		for(int i=0;i<connMax;i++){
			if(conn != null){
				if(connArray[i] == conn){
					connArray[i].close();
					connArray[i] = null;
					countUse--;//释放一个Connection对象
					System.out.println("释放1个Connection对象:index="+i+"当前在线连接数:"+countUse+",当前可用连接数:"+(connMax - countUse));
				}
			}
		}
	}

	//main入口
	public static void main(String[] args)throws Exception{
		Connection conn[]=new Connection[11];
		for(int i=0;i<11;i++){
			conn[i] = ConnectionManagerEnhence.getConnection();
			//System.out.println(conn[i]+":"+connArray[i]);
		}
			
		for(int j=0;j<10;j=j+2){
			ConnectionManagerEnhence.freeConnection(conn[j]);
		}
		conn[2] = ConnectionManagerEnhence.getConnection();	
	}
}
 


运行结果

F:\01 Java\01 Project\01 TinkingInJava>java ConnectionManagerEnhence
分配1个Connection对象:index=0当前在线连接数:1,当前可用连接数:9
分配1个Connection对象:index=1当前在线连接数:2,当前可用连接数:8
分配1个Connection对象:index=2当前在线连接数:3,当前可用连接数:7
分配1个Connection对象:index=3当前在线连接数:4,当前可用连接数:6
分配1个Connection对象:index=4当前在线连接数:5,当前可用连接数:5
分配1个Connection对象:index=5当前在线连接数:6,当前可用连接数:4
分配1个Connection对象:index=6当前在线连接数:7,当前可用连接数:3
分配1个Connection对象:index=7当前在线连接数:8,当前可用连接数:2
分配1个Connection对象:index=8当前在线连接数:9,当前可用连接数:1
分配1个Connection对象:index=9当前在线连接数:10,当前可用连接数:0
Sorry,There is no Connection Object for you to use!
释放1个Connection对象:index=0当前在线连接数:9,当前可用连接数:1
释放1个Connection对象:index=2当前在线连接数:8,当前可用连接数:2
释放1个Connection对象:index=4当前在线连接数:7,当前可用连接数:3
释放1个Connection对象:index=6当前在线连接数:6,当前可用连接数:4
释放1个Connection对象:index=8当前在线连接数:5,当前可用连接数:5
分配1个Connection对象:index=0当前在线连接数:6,当前可用连接数:4


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值