Java中finalize()的另類用法,做過JAVA程式設計的都知道,在JAVA中有一種垃圾收集器的機制,當它運行時(通常在系統內存低到一定限度時自動運行),會回收不再使用的對象所佔用的內存,所以,在JAVA程序中,我們通常只考慮創建對象,而從不關心對象的清除。 Finalize()是JAVA為類別提供的一種特殊方法。
垃圾收集器的工作過程大致上是這樣的:一旦垃圾收集器準備好釋放無用物件佔用的儲存空間,它首先呼叫那些物件的finalize()方法,然後才真正回收物件的記憶體。透過使用finalize(),就可以在垃圾收集器運作期間進行一些特殊的工作。下面一例就說明了finalize()的一種巧妙用法。
現在的商業應用系統越來越多的採用WEB形式。在WEB形式應用中,每一次頁面訪問是獨立的,前後不相關聯,即使多個用戶在同一時刻訪問應用的同一個頁面,用戶相互之間也是不知道的。如果想要檢查目前有哪些使用者正在使用系統(如準備恢復資料備份或進行系統升級時,系統管理員都很希望知道這些資訊),該怎麼辦呢? 基於Servlet、Jsp技術的WEB伺服器提供了隱含的Session、Application對象,利用它可以幫開發者實現一些資訊的持續保存與分享。當使用者存取一個WEB應用程式時,WEB伺服器會自動建立一個Session對象,該對象可以供使用者在會話期內在應用的所有頁面中共享資料; Application是WEB應用的一個全域對象。利用Session、Application對象,可以達到追蹤所有使用者資訊的目的。
當使用者開啟瀏覽器開始要求WEB應用程式的登入頁面時,WEB服務即為該客戶建立一個session,此後,在session的timeout時間內,該客戶都使用這個session(timeout時間可設定,如Tomcat伺服器是在各應用的web.xml檔案中設定)。若使用IE瀏覽器, Session與客戶IP位址、客戶程式進程ID所共同識別的連線有對應關係,相同IP位址、相同進程的視窗(如透過IE-檔案-新建-視窗開啟的新視窗)具有同一個session,所以session可用來識別各個獨立的客戶應用連線。
下面是一個範例:
為了方便處理,先建一個簡單類別(user)用來表達使用者資訊及存放sessionId:
package com; public class user { public String name=""; public String sessionId=""; }
另一個類別( testSession)用於處理使用者的login、logout等動作訊息,使系統可以追蹤目前連線的使用者資訊。
package com; import java.util.Vector; import com.user; public class testSession { public user User; private Vector vsid; public testSession() { User=new user(); } public boolean verify(String username,String password) throws Exception //验证用户/密码 { return true; } public void setSessionVar(String sesid,Vector sid) { this.User.sessionId=sesid; this.vsid=sid; } private static synchronized void addappses(user puser, Vector pvsid) { //记录一个新连接的用户 int pos=-1; user l_user; if (puser==null || pvsid==null) return; for(int i=0;i l_user=(user)pvsid.get(i); if(l_user.sessionId.equals(puser.sessionId)){ pos=i; break; } } if(pos==-1){ pvsid.add(puser); } else{ pvsid.set(pos,puser); } } private static synchronized void removeappses(user puser, Vector pvsid) { //移除一个退出的用户 int pos=-1; user l_user; if (puser==null || pvsid==null) return; for(int i=0;i l_user=(user)pvsid.get(i); if(l_user.sessionId.equals(puser.sessionId)){ pos=i; break; } } if(pos!=-1){ pvsid.remove(pos); } } protected void finalize() { this.removeappses(this.User,this.vsid); } public boolean login(String username) throws Exception { //处理登录 this.User.name=username; this.addappses(this.User,this.vsid); return true; } public boolean logout() throws Exception { //处理注销 this. finalize(); this.User=null; this.vsid=null; return true; } }
每個使用者均建立一個testSession對象,來保存該使用者的資訊。為了對類別testSession進行說明,必須同時引人另一個檔案logintest.jsp。這個用於範例的JSP檔案提供一個簡單的介面進行登入、登出處理。文件內容如下:
<%@ page import=" com.testSession, java.util.Vector"%> <%@page contentType="text/html;charset=GBK" %> <% request.setCharacterEncoding(response. getCharacterEncoding());%> <% String actionType=request.getParameter("actiontype"); String actionResult=""; if(actionType!=null) { if(actionType.equals("login")){ // -1- String userName=request.getParameter("username"); if(userName==null || userName.equals("")){ ; } else{ String password=request.getParameter("password"); if(password==null) password=""; testSession ts= (testSession)session.getAttribute("testSession"); if(ts!=null) { //-1.1- session.removeAttribute("testSession"); if( !ts.User.name.equals("")) ts.logout(); } ts=new testSession(); if(!ts.verify(userName,password)) { //验证用户与密码,看是否合法用户 actionResult="login fail"; //非法用户,显示错误信息 } else{ //验证成功 session.setAttribute("testSession",ts); Vector app_vts= (Vector)application.getAttribute("app_vts"); if(app_vts==null) { app_vts=new Vector(); application.setAttribute("app_vts",app_vts); } ts.setSessionVar(session.getId(),app_vts); ts.login(userName); actionResult=userName+" login success"; } } } if(actionType.equals("logout")){ testSession ts= (testSession)session.getAttribute("testSession"); if(ts!=null) { session.removeAttribute("testSession"); if( !ts.User.name.equals("")){ //-2- actionResult=ts.User.name; ts.logout(); } session.invalidate(); } actionResult=actionResult+" logout success"; } } else actionResult="null"; %>
以上是Java的finalize()方法怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!