【Java】【TIJ】讓類的對象個數受控於我們——實作類別對象個數的限制(完善版)__Java

來源:互聯網
上載者:User


    在上一篇中,我給大家介紹了一個控制類對象個數的實現方式(見連結: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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.