java中static是一個很有用的方法。
首先我們來看一個例子:
[java] view plain copy
- package com.test.dao;
- public class Test {
- private static int i = 0;
- private Test() { // ************************* 1
- }
- static {
- System.out.println(i++);
- }
- public static int getI() {
- return i;
- }
- }
[java] view plain copy
- package com.test.dao;
- public class Rua implements Runnable {
- public void run() {
- System.out.println("RUN: " + Test.getI());
- }
- public static void main(String args[])
- {
- Thread r1=new Thread(new Rua());
- Thread r2=new Thread(new Rua());
- Thread r3=new Thread(new Rua());
- r1.start();
- r2.start();
- r3.start();
- }
- }
首先我們來分析Test這個類,這個類中,有一個私有的構造函數,并且有一個static 的方法,在Rua這個類中,到底會有什麼樣的列印結果?
這個是得到的結果:
為了更好的說明這一點,繼續看下面的兩個類:
[java] view plain copy
- public class Test {
- private static int i = 0;
- private Test() {
- }
- static {
- System.out.println(i++);
- }
- public static int getI() {
- return i;
- }
- }
[java] view plain copy
- package com.test.dao;
- public class Rua implements Runnable {
- public void run() {
- System.out.println("RUN: " + Test.getI());
- }
- public static void main(String args[])
- {
- System.out.println(Test.getI()==Test.getI());
- }
- }
列印出的内容為:
這說明兩次所得到的執行個體是相同的。即單例模式。
是以,在這裡不難看出,在static方法内,隻運作了一次,并且形成了三個單例,每個單例之間都互相不影響,在Test類中,分别構造了三個不同的執行個體,這三個執行個體間互相不會影響。
這裡還有一個問題,注意看注釋1,這裡沒有使用共有構造函數,而是使用了私有構造函數,那麼如果在這裡使用了共有構造函數會有什麼影響呢?首先,使用自由構造函數,這個類不可以初始化,即不可以被new出來,如果沒有顯示的聲明構造函數,那麼系統會為預設的使用該類的共有構造函數,是以在這裡,既然需要使用到單例,那麼在這不可避免的就需要使用到私有構造函數,因為,如果使用了共有構造函數,那麼可能造成的影響:該類可以被new出來,這樣的話,就不能被保證該執行個體會被這樣而使用。
這裡還有一點可能會發生疑問的就是,如果構造函數和static同時存在的時候,系統到底先執行哪一個呢?
系統首先會運作static内部的内容。
這裡能夠引出的問題:大多數人應該看過hibernate的源碼,在這裡貼一段過來
[java] view plain copy
- public class HibernateSessionFactory {
- private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
- private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
- private static Configuration configuration = new Configuration();
- private static org.hibernate.SessionFactory sessionFactory;
- private static String configFile = CONFIG_FILE_LOCATION;
- static {
- try {
- configuration.configure(configFile);
- sessionFactory = configuration.buildSessionFactory();
- } catch (Exception e) {
- System.err
- .println("%%%% Error Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- private HibernateSessionFactory() {
- }
- public static Session getSession() throws HibernateException {
- Session session = (Session) threadLocal.get();
- if (session == null || !session.isOpen()) {
- if (sessionFactory == null) {
- rebuildSessionFactory();
- }
- session = (sessionFactory != null) ? sessionFactory.openSession()
- : null;
- threadLocal.set(session);
- }
- return session;
- }
在這裡,我們便可以看出點hibernate對于資料庫連接配接的眉目了
下面看看Static在hibernate中的一個應用。
package com.nvidia.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
//成員變量的建立,
private static SessionFactory factory;
//隻裝載一次變量的寫法
static {
try {
Configuration cfg = new Configuration().configure();
factory = cfg.buildSessionFactory();
} catch(Exception e){
e.printStackTrace();
}
}
public Session getSession(){
return factory.openSession();
}
public void closeSession(Session session){
if(session != null)
if(session.isOpen())
session.close();
}
public static SessionFactory getSessionFactory(){
return factory;
}
}