`
dickyzhu
  • 浏览: 111740 次
  • 性别: 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 里面的方法就行,非常方便,你值得拥有

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

    2. **Assert(断言)**:在Java编程中,`assert`关键字用于在测试阶段检查代码假设是否正确,它是进行单元测试和调试的强大工具。在本项目中,通过扩展Spring Boot的断言功能,我们可以创建自定义的断言方法,以适应...

    Java陷阱之assert关键字

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

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

    Java异常处理机制是Java编程中不可或缺的一部分,它用于处理程序运行过程中可能出现的错误或异常情况。这个机制通过五个关键字:try、catch、throw、throws、finally来实现。 1. **try** 关键字:用于包围可能抛出...

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

    在Java编程中,动态编译字符串成Java代码并将其加载到JVM(Java虚拟机)是一种高级技巧,常用于运行时代码生成、元编程或插件系统等场景。这一技术的核心在于利用Java的反射API和Java Compiler API。下面将详细阐述...

    Java断言(assert)

    Java断言(assert) Java断言是一种 debugging 机制,允许开发者在Java程序中添加检查点,以确保程序的正确性。断言可以在开发和测试阶段使用,以确保程序的正确性和可靠性。 Java断言的历史 Java断言是从 JDK 1.4 ...

    Java陷阱之assert关键字详解

    标题中提到的“Java陷阱之assert关键字详解”所指的知识点主要涉及Java语言中assert关键字的介绍、使用、限制以及使用时需注意的潜在问题。Assert关键字作为Java SE 1.4版本引入的功能,其设计目的是为了帮助开发者...

    eclipse如何开启断言assert

    在Java编程中,断言(Assert)是一种强大的调试工具,它允许程序员在代码中插入条件检查,以确保程序在特定点的行为符合预期。Eclipse作为流行的Java开发集成环境,提供了方便的方式来启用或禁用断言功能。以下是...

    Java关键字的用法

    ### Java关键字的用法 Java作为一种广泛使用的编程语言,拥有丰富的关键字来支持其核心功能与特性。本文将详细介绍部分重要的Java关键字及其用法。 #### 1. `abstract` `abstract`关键字用于定义抽象类或抽象方法...

    Core Java 知识点汇总

    ### Core Java 知识点汇总 #### Java 关键字 Java 是一种强大的面向对象编程语言,广泛应用于企业级应用开发、移动应用(尤其是 Android 应用)、Web 开发等领域。理解 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面试题大全(自己整理的最全的Java面试题,背过了很有用)

    根据提供的文件信息,这里将对其中提及的关键Java概念和知识点进行详细解释: ### final, finally, finalize #### final `final` 是一个关键字,在 Java 中用于限制类、方法或变量的行为: - **类**: 当一个类被...

    变态JAVA面试32问及答案

    ### 变态JAVA面试32问及答案精解 #### 第一问:谈谈final, finally, finalize的区别。 - **final**:此关键字主要用于确保代码的不可变性。当一个类被声明为`final`时,它无法被继承,即不能有子类。同样地,变量...

    Java Runtime Environment JRE 1.4.2

    JRE 1.4.2还引入了Java assert关键字,用于在代码中添加断言,帮助开发者进行调试和验证程序逻辑。这一特性使得程序员可以更容易地检测和预防潜在的错误。 此外,JRE 1.4.2在安全性方面也有提升,比如增强了SSL...

    java基础知识和概念总结详细信息

    在Java中,可以通过`assert`关键字来声明一个断言。例如: ```java assert x &gt; 0 : "x should be positive"; // 如果x不大于0,则抛出AssertionError ``` #### 7. String与String对象 在Java中,`String`是一个不...

    46个java关键字介绍和使用大全含示例(值得珍藏)

    Java关键字是编程的基础,它们是Java语言中预定义的特殊标识符,有着特定的含义和功能。本篇文章将深入探讨46个Java关键字,并通过示例来解释它们的使用。 1. `abstract` 关键字用于声明抽象方法或抽象类。抽象方法...

    变态级java程序员面试32问

    ### 变态级Java程序员面试32问解析 #### 1. final, finally, finalize 的区别 - **final**:关键字final在Java中用于声明一个不可更改的变量、方法或类。当一个变量被声明为final时,一旦赋值之后就无法修改;如果...

    JAVA变态面试32问

    ### JAVA变态面试32问知识点解析 #### 1. final, finally, finalize - **final**: 在Java中,`final`关键字有多个用途。当它用于变量时,表示该变量的值一旦被初始化就不能更改(对于引用类型的变量,指的是引用不...

    java,txt 格式面试题

    ### Java面试题解析 #### 1. Java与C++中的异常处理机制差异 - **Java异常处理机制**:Java提供了一套完整的异常处理框架来帮助开发者处理程序运行时可能出现的各种异常情况。当程序中出现异常时,Java会抛出一个...

    java面试题大全-基础方面.pdf

    在Java中,断言可以用`assert`语句表示: ```java assert condition : message; ``` 这里`condition`是一个布尔表达式,`message`是在断言失败时显示的信息。断言主要用于调试目的,可以在开发过程中检查代码的正确...

Global site tag (gtag.js) - Google Analytics