【現狀描述】
宏控是管理開發代碼的重要手段,特別是C/C++項目。通過引入宏控,我們可以為每個項目配置一個config文件,裡面定義了所有的功能宏控的狀態(開啟 or 關閉)。
不同於C/C++, java 中沒有原生的預編譯命令,目前廣泛采用的方式是使用靜態變量近似代替宏。但是這也為項目管理帶來一點點麻煩:
A,B兩項目在同一套代碼上開發,通過config文件實現不同的功能。然而,即使是單獨為B項目定制的功能,也必須在A項目中添加相應的宏控,否則會造成編譯通不過。這樣做至少造成兩個問題:
1. 項目實際配置的功能項不醒目。各種需要的不需要的功能混雜在一起。
2. 項目的配置文件隨著開發一直處於變更狀態,而且隨著項目和分支增加,維護將變得困難,容易有漏網之魚。
【解決方法】出現上面困難的根本點是靜態變量不同於預編譯命令——不定義即為false。 好在通過繼承方式我們可以模擬實現這一點。
利用基類作默認設置,在派生類中通過重定義配置需要的功能,從而實現一種類似於C/C++的預編譯宏控的效果,上面的兩個問題也迎刃而解。
1. 為所有配置文件設置一個基類,基類中定義了所有宏控,且默認總為關閉狀態。
2. 所有項目的配置文件均繼承自此基類,如果需要開啟某功能,則在該文件中將對應宏控重新定義為開啟狀態。
Example
/**
* 這個類所在的文件不抽取,且配置所有功能,config1,config2,。。。
* @author
*/
publicclass DefaultConfig {
/* config 1 */
publicstatic finalboolean config1 =false;
/* config 2 */
publicstatic finalboolean config2 =false;
}
/**
* 這個類所在的文件需要抽取,代表具體某個項目的配置。
* 如果需要配置config1,則重定義config1 = true
* 如果不需要配置config2,則根本不用做任何處理。就像C/C++的預編譯宏控
* @authorl
*/
publicclass Config extendsDefaultConfig {
/* needconfig 1 */
publicstatic finalboolean config1 =true; //重定義
}
嗯,是不是很接近C++的java宏控呢