Stay Hungry(业精于勤,拒绝平庸)

锲而舍之,朽木不折;锲而不舍,金石可镂!专注Java、Linux、大数据、算法

【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


阅读更多
文章标签: java 实例 对象
个人分类: Java
上一篇【Java】【TIJ】让类的对象个数受控于我们——实现类对象个数的限制
下一篇【Java】【FAQ】【环境变量设置问题】错误:找不到或无法加载主类 &quot;xxxxxx&quot;
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭