`
dickyzhu
  • 浏览: 107117 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

java assert

阅读更多
问题
断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。
回答
方法根据存取修饰符分为两类
1) public方法和protected方法
2) private方法和缺省修饰方法

第一类方法是可以被外包中的其他类访问的,是对外公开的。第二类方法是当前类或者本包中的类才可以访问的,是不对外公开的。对外公开的方法的调用端可能是其他开发人员及其他们编写的程序,他们不会知道作为作者的你在这个方法里面是如何验证以及检查参数的,所以所有相关的验证以及检查参数的代码在这个方法里面就不能省略。比如

public class A {
                // 计算组合数C(m, n)
                public int combination(int m, int n) {
                                // 根据组合数的数学定义,m必须大于等于n
                                if(m < n)
                                                throw new RuntimeException(“…”);
                                …
                }
}

上述黑体的代码就是对参数m和n进行检查的代码,它们的作用跟

                assert m>=n;

是类似的。唯一的不同仅在于前者是普通的Java代码,任何情况下都会被执行。而后者的assert语句则只有在JVM打开-ea开关的情况下才会被执行。所以在对外公开的方法里面应该用普通的Java语句来检查参数而不是用assert。

但是在不对外公开的方法里面却可以用assert而不是普通的Java代码。因为不对外公开的方法都是给自己用的,自己总是很清楚当前这个函数的应该要满足什么条件。比如,上例中的combination(int m, int n)方法如果是private方法,只能是作为作者的你自己使用,则你只需要用assert m>=n语句对参数进行验证就行了。这样在调试阶段你可以命令JVM打开ea开关,从而保证参数得到验证;而当真正交付运行的时候则可以关闭这个开关因为你可能已经验证过了所有调用combination(m, n)方法的地方,已经在调用端就确定了m>=n始终成立,从而避免对参数进行不必要的验证。

对外公开的方法就没有这个便利了,因为你难以保证别人在调用你的combination(m, n)方法时第一个实参大于等于第二个实参。

可能很多人会问,费这么大劲也不过就是节省了一个if语句的执行嘛,有必要费这么大劲吗?这个怀疑其实没有错误,但是请记住:人家是Java高手的原因,恰恰就是因为人家的代码比你的只快了1个毫秒,只节省了1个字节内存,只少了一行代码,只少用了一个变量。你关注这些细节了,你就是高手了。
分享到:
评论
1 楼 一个武将 2011-11-23  
对外公开的方法就没有这个便利了,因为你难以保证别人在调用你的combination(m, n)方法时第一个实参大于等于第二个实参。

不错,现在貌似懂点了。

相关推荐

    Assert.java

    适用于Java大部分非空判断,有效的减少空指针问题,直接调用Assert 里面的方法就行,非常方便,你值得拥有

    Java陷阱之assert关键字

     在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略!),如果要开启断言...

    业务异常提示处理 springboot+Assert(自定义断言)

    使用springboot框架快速搭建,封装自定义断言做业务校验,公共异常处理打印日志, 更简单的业务判断处理

    动态编译字符串成java,并且添加class到jvm

    动态编译字符串成java,并且添加class到jvm

    java异常处理机制示例(java抛出异常、捕获、断言)

    主要介绍了java异常处理机制示例(java抛出异常、捕获、断言),需要的朋友可以参考下

    Java陷阱之assert关键字详解

    详细介绍了Java陷阱之assert关键字,有需要的朋友可以参考一下

    Java断言(assert)

    可以为Java复杂的测试提供简单的方法!可以加快开发进度

    Java关键词assert的使用(基于IntelliJ IDEA)

    正确算法 private static int pythagorean(int x, int y) { return x * x + y * y; } 错误算法 private static int pythagorean(int x, int y) { return x * x + y * y +...assert想在IDE中使用,就必须开虚拟机选项

    java、android解压缩Assert文件夹下的压缩文件

    通过调用UnzipUtils下面的UnzipUtils.createFile&#40;locationZip&#41;;UnzipUtils.copyBigDataToSD(MainActivity.this, locationZip, ZIP_NAME);UnzipUtils.upZipFile&#40;new File(locationZip&#41;...

    A Java architecture test library, to specify and assert ar.zip

    A Java architecture test library, to specify and assert ar.zip

    Java项目开发常用工具包util

    Java项目开发常用工具包,其中主要包括:Assert.java BufferedImageLuminanceSource.java CipherUtil.java ClientConst.java CodeUtil.java ComputeUtil.java DataUtils.java DateUtils.java Digests.java Encodes....

    java 常用英语词汇大全

    java 常用英语词汇大全 部分内容如下: algorithm n.算法['.lg.riem] annotation [java]代码注释[.n.u'tei..n] anonymous adj....(反义:directly adv....assert (关键字) 断言[.'s.:t] ‘ (java 1.4 之后成为关键字

    junit-assert-collector:Java库扩展了JUnit的ErrorCollector类,提供了典型的JUnit样式声明方法

    junit-assert-collector 我编写的Java库是为了补充我在Savvis / CenturyLink最初开发的测试框架而开发的测试框架。 该库实质上扩展了JUnit库的org.junit.rules.ErrorCollector类,并且提供了大多数(如果不是全部)...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    8.1.5 关于assert 245 8.2 异常与资源管理 247 8.2.1 使用finally 247 8.2.2 自动尝试关闭资源 249 8.2.3 java.lang.autocloseable接口 251 8.3 重点复习 255 8.4 课后练习 256 chapter8 collection与...

    JAVA--达内培训笔记

    enum 枚举 assert 断言 一个标识符尽量符合语义信息,提高程序可读性 类 名 :每个单词首字母大写, 变量和方法 :第一个单词小写,后边的每个单词首字母大写 包 名 :全部小写 常 量 :全部大写 11、局部...

    JAVA断言技术详解

    JAVA断言技术详解,1、What will happen when you attempt to compile and run the following code? (Assume that the code is compiled and run with assertions enabled) 1. public class AssertTest 2. { 3. ...

    assert-text:在需要时断言多行文本

    用法 var assertText = require ( 'assert-text' ) ;assertText . equal ( 'what a wonderful\n' + 'idea for the\n' + 'module' , 'what a wonderful\n' + 'idea for a\n' + 'module' ) ; 上面的示例将抛出: Error...

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    Java基础单词

    5. assert [ə'sɜːt] vt. 坚持;声称 6. command [kə'mɑːnd] vi. 命令,控制 7. compile [kəm'paɪl] vt. 编译;编辑; 8. compilation [kɒmpɪ'leɪʃ(ə)n] n. 编辑 9. execute ['eksɪkjuːt] vt...

Global site tag (gtag.js) - Google Analytics