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

原创 2014年10月08日 07:54:29


    在上一篇中,我给大家介绍了一个控制类对象个数的实现方式(见链接: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】【TIJ】让类的对象个数受控于我们——实现类对象个数的限制

下面介绍一个限制类对象个数的例子: 创建一个名为ConnectionManager的类,

【Java】【TIJ】实现一个类:不允许用构造方法来直接创建类实例(对象)

某些情况下,也许我们不希望客户使用

C++如何实现类对象只能动态分配或只能静态分配

C++如何实现类对象只能动态分配或只能静态分配 C++中建立类的对象有两种方式: (1)静态建立,例如 A a;      静态建立一个类对象,就是由编译器为对象在栈空间中分配内存。使用这种方法,...

使用DAO工厂创建实现类对象

首先分析DAO模式中的每一部分 VO(对象实体):这个类成员变量与数据库中每个字段一一对应,同时提供了相应是set和get方法来设置或取得数值。这个类一般是通过IDE自动生成的 D...

Java多态性详解——父类引用子类对象

面向对象编程有三个特征,即封装、继承和多态。   封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。   继承是为了重用父类代码,同时为实现多态性...
  • chenxu6
  • chenxu6
  • 2015年08月19日 13:43
  • 322

java中的反射 2.1——类:获取类对象@译自Oracle官方文档

译自:http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html java.lang.Class类是所有反射操作的切入点。除j...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java】【TIJ】让类的对象个数受控于我们——实现类对象个数的限制(完善版)
举报原因:
原因补充:

(最多只允许输入30个字)