利用导入改变java行为

Java已取消的一种特性是C的“条件编译”,它允许我们改变参数,获得不同的行为,同时不改变其他任何代码。Java之所以抛弃了这一特性,可能是由于该特性经常在C里用于解决跨平台问题:代码的不同部分根据具体的平台进行编译,否则不能在特定的平台上运行。由于Java的设计思想是成为一种自动跨平台的语言,所以这种特性是没有必要的。
然而,条件编译还有另一些非常有价值的用途。一种很常见的用途就是调试代码。调试特性可在开发过程中使用,但在发行的产品中却无此功能。Alen Holub(www.holub.com)提出了利用包(package)来模仿条件编译的概念。根据这一概念,它创建了C“断定机制”一个非常有用的Java版本。之所以叫作“断定机制”,是由于我们可以说“它应该为真”或者“它应该为假”。如果语句不同意你的断定,就可以发现相关的情况。这种工具在调试过程中是特别有用的。
可用下面这个类进行程序调试:
 

//: Assert.java
// Assertion tool for debugging
package com.bruceeckel.tools.debug;

public class Assert {
  private static void perr(String msg) {
    System.err.println(msg);
  }
  public final static void is_true(boolean exp) {
    if(!exp) perr("Assertion failed");
  }
  public final static void is_false(boolean exp){
    if(exp) perr("Assertion failed");
  }
  public final static void
  is_true(boolean exp, String msg) {
    if(!exp) perr("Assertion failed: " + msg);
  }
  public final static void
  is_false(boolean exp, String msg) {
    if(exp) perr("Assertion failed: " + msg);
  }
} ///:~

这个类只是简单地封装了布尔测试。如果失败,就显示出出错消息。在第9章,大家还会学习一个更高级的错误控制工具,名为“违例控制”。但在目前这种情况下,perr()方法已经可以很好地工作。
如果想使用这个类,可在自己的程序中加入下面这一行:
import com.bruceeckel.tools.debug.*;
如欲清除断定机制,以便自己能发行最终的代码,我们创建了第二个Assert类,但却是在一个不同的包里:

 

//: Assert.java
// Turning off the assertion output
// so you can ship the program.
package com.bruceeckel.tools;

public class Assert {
  public final static void is_true(boolean exp){}
  public final static void is_false(boolean exp){}
  public final static void
  is_true(boolean exp, String msg) {}
  public final static void
  is_false(boolean exp, String msg) {}
} ///:~

现在,假如将前一个import语句变成下面这个样子:
import com.bruceeckel.tools.*;
程序便不再显示出断言。下面是个例子:
 

//: TestAssert.java
// Demonstrating the assertion tool
package c05;
// Comment the following, and uncomment the
// subsequent line to change assertion behavior:
import com.bruceeckel.tools.debug.*;
// import com.bruceeckel.tools.*;

public class TestAssert {
  public static void main(String[] args) {
    Assert.is_true((2 + 2) == 5);
    Assert.is_false((1 + 1) == 2);
    Assert.is_true((2 + 2) == 5, "2 + 2 == 5");
    Assert.is_false((1 + 1) == 2, "1 +1 != 2");
  }
} ///:~

通过改变导入的package,我们可将自己的代码从调试版本变成最终的发行版本。这种技术可应用于任何种类的条件代码。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索boolean
, static
, assert
, public
, exp
, gccundefined编译exp
, Assert,Java
void
改变平素志向行为、行为改变理论、行为改变技术、指改变平素志向行为、行为改变,以便于您获取更多的相关知识。

时间: 2024-10-31 19:46:13

利用导入改变java行为的相关文章

利用RMI实现JAVA分布式应用

Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力.Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一.其实它可以被看作是RPC的Java版本.但是传统RPC并不能很好地应用于分布式对象系统.而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远

关于利用fgets()改变文件指针位置再利用fprintf()更新文件数据的一些小疑问求教

问题描述 关于利用fgets()改变文件指针位置再利用fprintf()更新文件数据的一些小疑问求教 下面便是一个更新卡信息文件数据的函数updateCard int updateCard(const char* CardPath,const Card* pcard,int nIndex) {//更新卡信息文件中的数据,CardPath为文件路径,pcard为指向要更新的卡信息结点的指针,nIndex为卡信息在文件中的索引号(即在卡信息文件中的行数) FILE* fp = NULL; long

51单片机利用串口改变时钟问题

问题描述 51单片机利用串口改变时钟问题 下面是我用串口改变时间的代码,但是我只会改变时.分.秒中的一个,求大神帮我改一改能够分别改时.分.秒 #include<reg51.h>#define uint unsigned int#define uchar unsigned char uchar hourminsectemp;uchar aa;uchar code table[]={0xc00xf90xa40xb00x990x920x820xf80x800x90}; void delay(uin

C++利用JNI访问Java,提示找不到class

问题描述 c++利用jni访问java,代码结构如下:[zhang@tchelloworld]$pwd/usr/home/zhang/jni/helloworld[zhang@tchelloworld]$lshello.cppMakefileMyTest.javaMyTest.java.bakREADME[zhang@tchelloworld]$echo$CLASSPATH/usr/local/jdk/lib:/data1/hbase-0.96.2/hbase-client/src/main/j

【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码

原文:[项目分析]利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码 最近正在进行项目服务的移植工作,即将JAVA服务的程序移植到DotNet平台中. 在JAVA程序中,有个HTTP请求数据头中,包含一个BASE64编码的字符串,例如: eJyVjMENgDAMA1fpBMjnIkp3ZzZEpAa1PLmXY10sDdqBqr54Ww5AthG7zxJYa0MYr9p7bPFnK/uqjCj06y7JfHwAX3AhhA== 现在需要将这个字符串转化成原始字

利用bat设置java环境变量的问题!!

问题描述 利用bat设置java环境变量,网上查到了很多资料,但是我写的bat运行起来总是报错,根本没有设置成功.以下是bat的内容:setJAVA_HOME=D:ProgramFilesJavajdk1.7.0_15setCLASSPATH=.;%JAVA_HOME%/libsetPATH=%PATH%;%JAVA_HOME%/bin请问上面有没有错?还有一种代码设置:wmicENVIRONMENTcreatename="JAVA_HOME",username="<s

eclipse 导入的java文件出错

问题描述 eclipse导入的java文件很多都出错了怎么办???求好心人帮忙解决我是把java源文件导入src目录下 解决方案 解决方案二:要整个工程导入,不能错误应该是没有导入相应的包.解决方案三:1.需要导入整个项目.2.查看一下lib下的jar包是否都引入.3.查看是普通Java项目还是其他项目,如JavaWeb.4.重新clean一下.解决方案四:右键工程BuildPath-->ConfigureBuildPath编辑一下JRESystemLibrary就ok了解决方案五:你的图里面说

利用Socket进行Java网络编程

Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递.在Java中,有专门的Socket类来处理用户的请求和响应.利用Socket类的方法,就可以实现两台计算机之间的通讯.这里就介绍一下在Java中如何利用Socket进行网络编程. 在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法.getInp

利用数字签名超越Java Applet的安全限制

Java技术之所以在今天得到了如此广阔的应用,其中它的安全性是不能不提的.不同于其它技术(例如Microsoft的ActiveX)中安全性作为附加设计和补丁,Java从设计之初便考虑到了安全性.因此Java的安全性是在语言层次实现的.Java的安全性由下列三个方面保证: 1.语言特性(包括数组的边界检查.类型转换.取消指针型变量). 2.资源访问控制(包括本地文件系统访问.Socket连接访问). 3.代码数字签名(通过数字签名来确认代码源以及代码是否完整). 本文主要讨论结合后两种技术来实现超