Java類初始化順序

cow977發表於2011-05-09
最近,在一個系統中用到配置,設計了一個基類,繼承了Thread,以監視配置檔案的變化:
package cs.Config;
 
public abstract class BaseConfig extends Thread {
 private String url;
 private int ldLastModified = 0L;
 private static int ISINVALID_SCAN_TIME = 10;
 protected BaseConfig(String url) throws Exception {
  setUrl(url);
  String XMLconfig = loadConfigFile();
  this.oldLastModified = XMLconfig.hashCode();
  setXmlConfig(XMLconfig);
  setDaemon(true);
  start();
 }
 public void run() {
  while (true) {
   long time = 1000L;
   time *= ISINVALID_SCAN_TIME;
   try {
    String XMLconfig = loadConfigFile();
    int nowlastModified = XMLconfig.hashCode();
    if (nowlastModified != this.oldLastModified) {
     this.oldLastModified = nowlastModified;
     setXmlConfig(XMLconfig);
     System.out.println("configXML Loading new");
    }
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    try {
     Thread.sleep(time);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
 }
 public abstract void setXmlConfig(String ConfigString)
   throws BusinessException;
}
再設計一個具體類:
package cs.Config;
public class SystemConfig extends BaseConfig {
 private SystemXmlConfig configXML;
 private String url = "";
 public SystemConfig(String url) throws BusinessException {
  super(url);
  this.url = url;
 }
 public void setXmlConfig(String ConfigString) throws BusinessException {
  this.configXML = new SystemXmlConfig(ConfigString);
  if (this.configXML == null)
   throw new Exception("不能建立SystemXmlConfig物件:" + ConfigString);
 }
 public SystemXmlConfig getXmlConfig() throws BusinessException {
  if (this.configXML == null)
   new SystemConfig(this.url);
  return this.configXML;
 }
}
原來SystemConfig類的getXmlConfig是Static方法,configXML也是Static成員,有初始化=null,因採用靜態方法和成員,系統只能用到一個配置檔案,想能用到多個配置檔案,所以改成了例項方法和成員。
 
本例中有一點比較特殊,就是在父類的構造中用到了子類的方法setXmlConfig,此時,子類的configXML 變數還未初始化,如果在子類中有初始化動作,則子類的初始化動作在父類的構造執行後再執行,則造成原來的值丟失。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-694865/,如需轉載,請註明出處,否則將追究法律責任。

相關文章