Java類初始化順序
最近,在一個系統中用到配置,設計了一個基類,繼承了Thread,以監視配置檔案的變化:
package cs.Config;
public abstract class BaseConfig extends Thread {
private String url;
private int ldLastModified = 0L;
private static int ISINVALID_SCAN_TIME = 10;
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();
setUrl(url);
String XMLconfig = loadConfigFile();
this.oldLastModified = XMLconfig.hashCode();
setXmlConfig(XMLconfig);
setDaemon(true);
start();
}
setDaemon(true);
start();
}
public void run() {
while (true) {
long time = 1000L;
time *= ISINVALID_SCAN_TIME;
try {
String XMLconfig = loadConfigFile();
int nowlastModified = XMLconfig.hashCode();
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();
}
}
}
}
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;
throws BusinessException;
}
再設計一個具體類:
package cs.Config;
public class SystemConfig extends BaseConfig {
private SystemXmlConfig configXML;
private String url = "";
private SystemXmlConfig configXML;
private String url = "";
public SystemConfig(String url) throws BusinessException {
super(url);
this.url = url;
}
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);
}
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,因採用靜態方法和成員,系統只能用到一個配置檔案,想能用到多個配置檔案,所以改成了例項方法和成員。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java 類初始化順序Java
- java類初始化的順序Java
- Java類(繼承)初始化順序Java繼承
- Java初始化順序Java
- Java子類和父類的初始化執行順序Java
- 淺談Java類中的變數初始化順序Java變數
- JAVA物件的初始化順序Java物件
- java類載入順序Java
- Java中class的初始化順序Java
- 關於java的初始化順序Java
- JVM類載入機制與類初始化順序JVM
- c#類的成員初始化順序C#
- Java父子類載入順序Java
- 九、 Java程式初始化的順序(二)Java
- 類的成員變數的初始化順序變數
- Java類的基本執行順序Java
- Java的類的例項化順序Java
- 總結類初始化時的程式碼執行順序
- Java初始化靜態變數的時間順序Java變數
- c#物件初始化順序C#物件
- java類內部程式碼執行順序Java
- Java中,類與類,類中的程式碼執行順序Java
- 程式碼說事 之 建立java物件的初始化順序Java物件
- static程式碼塊、構造程式碼塊、建構函式以及Java類初始化順序C程式函式Java
- Java static變數、作用域、建構函式初始化順序Java變數函式
- DS順序表--類實現
- C++建構函式初始化順序C++函式
- C++和C#物件初始化順序C++C#物件
- Java實現順序表Java
- 順序表(順序儲存)迴圈佇列類(初始化,入隊,退隊,輸出排頭與排尾指標及元素)佇列指標
- java運算子優先順序Java
- JAVA中取順序號 (轉)Java
- 類的例項化順序和分析
- css中連結偽類的順序CSS
- java setPriority()設定優先順序Java
- Java框架學習順序是哪些Java框架
- Java框架學習順序是哪些?Java框架
- Java 修飾符順序問題Java 修飾符