在JAVA语言里模拟“宏”

       理解“在一种语言上编程”和“深入一种语言去编程”的区别,大多数重要的编程原则并不依赖特定的语言,而依赖于你使用语言的方式。如果你使用的语言缺乏你希望用的构件,或者倾向于出现其他种类的问题,那就应该试着去弥补它。发明你自己的编码约定,标准,类库以及其他改进措施;

——《代码大全》

       JAVA没有C的条件编译功能,该功能可以使你不必更改任何程序代码,就能够切换开关并产生不同的行为。JAVA去掉此功能的原因可能是因为C在绝大多数情况下是用此功能来解决跨平台问题的,即程序代码的不同部分是根据不同的平台来编译的。由于JAVA自身可以自动跨越不同的平台,因此这个功能对JAVA而言是没有必要的。

——《JAVA编程思想》

 

       因为Android的原因,接触了JAVA。自此,困扰我的一个问题是,JAVA里面没有C语言的宏。那么怎么用一套代码处理不同需求,定义不同功能呢?

       比如在C语言里面,我们可以用宏方便的组织代码,并根据宏的关闭和打开对产品进行个性化定制。但是JAVA里面没有宏,显然做不到这一点。

       我相信JAVA大师们在决定JAVA是否需要宏时,进行了缜密的考虑。也应该,很高效的运用面向对象编程技术,合理运用JAVA的继承,多态等机制能够写出方便定制化的代码。

但是如果JAVA在一定程度上引入宏,一定能更好的发挥它的威力,吸引更多的程序员。

 

想到的JAVA没有宏的缺点如下:

1.              不能很好的调试代码:在代码开发过程中,如果加入了很多相对独立的功能,这时候如果调试,没有宏,则不方便用排除法进行调试。总不能找到所有代码一个个注释掉吧?

2.              不能很好的维护代码:比如维护第三方释放过来的代码,在使用过程中,如果对某些代码做改进,如果没有宏进行区分,则在后续的代码升级过程中,会很麻烦;

3.              不能很好的定制代码:如果没有宏,用一套代码怎么来根据不同的需求来定制代码呢?卓越的面向对象能力可能能够解决问题,但对于一般的人,要求可能太高了。

4.              等等~

 

C语言里面的宏:

定义宏:

#define MY_MACRO

可以这样使用:

#if defined (MY_MACRO) printf("MY_MACRO is defined./n"); #else printf("MY_MACRO is not defined./n"); #endif

C语言里面的宏的“变异”:

定义“宏”

const bool MY_MACRO = TRUE;

       使用宏:

if (MY_MACRO) printf("MY_MACRO is defined./n"); else printf("MY_MACRO is not defined./n");   

我没有看过编译后的汇编语言,但是对于if (MY_MACRO)语句,编译器应该会直接忽略掉;即使没有忽略掉,占用了一条汇编语言,这个性能损失也应该可以忽略不计的。

 

public final static类型变量在JAVA里面模拟宏。

 

定义“宏”:

public final static boolean DbgFlag_B = true; // true or false

使用“宏”:

if ( MacroDefinition.DbgFlag_B ) { System.out.println("This is a Debug Info"); }   

“宏”类:(这样我们可以用make文件来决定使用那个宏类,来对产品进行定制化。)

final class MacroDefinition { // to decide whether print debug infomation. public final static boolean DbgFlag_B = true; // true or false // product type public enum ProductType_E { ProductA_E, // For Americal version ProductC_E, // For Chinese version ProductOther_E, } public final static ProductType_E ProdcutCurr_E = ProductType_E.ProductA_E; public static void PrintDebugInfo_F( String DbgInfo ) { if ( MacroDefinition.DbgFlag_B ) { System.out.println(DbgInfo); } } } public class Macro { public static void main(String[] args) { if ( MacroDefinition.DbgFlag_B ) { System.out.println("This is a Debug Info"); } if ( MacroDefinition.ProdcutCurr_E == MacroDefinition.ProductType_E.ProductA_E ) { System.out.println("This is for Aemerica Version"); } if ( MacroDefinition.ProdcutCurr_E == MacroDefinition.ProductType_E.ProductC_E ) { System.out.println("This is for Chinese Version"); } if ( MacroDefinition.ProdcutCurr_E == MacroDefinition.ProductType_E.ProductA_E || MacroDefinition.ProdcutCurr_E == MacroDefinition.ProductType_E.ProductC_E ) { System.out.println("This is for Chinese and Americal Version"); } MacroDefinition.PrintDebugInfo_F("Hello, Java Macro"); if ( !MacroDefinition.DbgFlag_B ) { System.out.println("This is not one Debug Info"); } } }

你可能感兴趣的:(在JAVA语言里模拟“宏”)