Java中的断言:过渡时间表

时间:2017-04-23 10:15:22

标签: java javac assertions

我偶然发现了以下内容(http://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#compatibility):

  

除非您使用 -source 1.4 特别请求源模式1.4   flag,编译器在源模式1.3下运行。 如果你忘了使用   这个标志,使用新断言语句的程序不会   编译。让编译器使用旧语义作为其默认值   行为(即允许断言用作标识符)是   完成最大的源兼容性。源模式1.3可能是   随着时间的推移逐步淘汰。

请注意,这是来自Java 8的官方Oracle文档---但我之前从未遇到过这个特定的编译时错误。更重要的是,

class Test{
    public static void main(String[] args){
        int a = 0;
        assert a < 0: "a is not negative!";
    }
}

不仅在Java 8下编译,而且在没有标记的情况下编译。调用

javac Test.class

JDK 1.6.0_24(我最老的;〜2011年3月)。

显然,作为新关键字转换为assert已经结束了。

所以这些是我的问题:具体是什么时候发生的?为什么在地球上Oracle不断添加这个警告(&#34;如果你忘了使用这个标志,程序不会编译&#34 ;;看起来,它的斜体,甚至!)到每个文档新版本? 这不仅仅是空闲的好奇心,让我感到奇怪的是什么时候&#39;为什么&#39;在四天之内我将为Java 8(1Z0-809)编写我的OCP考试,我希望各种各样的恶作剧从黑暗角落向我跳跃...... / p>

1 个答案:

答案 0 :(得分:1)

这个官方Java指南:http://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#compatibility是为Java 1.4版本编写的,它引入了以前没有的断言声明(在1.3版本中)。

实际上,本指南来自此页面,它引用了每个已发布Java版本的一些增强功能: http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html

它来自这个特定的部分:

  

J2SE 1.4中的增强功能

     

Assertion Facility - 断言是布尔表达式   程序员认为对于计算机的状态是真实的   程序。例如,在对列表进行排序之后,程序员可能会   断言列表按升序排列。评估断言   运行时确认它们的有效性是最强大的工具之一   提高代码质量,因为它很快就会发现程序员的代码   关于程序行为的误解。

所以,实际上并不是没有更新文档的问题 您必须将此信息视为指定版本的指南:J2SE 1.4 拥有这种历史记录对于通过版本概述Java语言的演变非常有用。

但是您的测试是准确的,您还可以从每个版本更新的javac官方文档进行验证,javac JDK 8默认情况下不使用1.3源代码。

编译类时,javac命令可以将source作为参数,指定源代码中要接受的主要JDK版本。

From the official Java 8 documentation

  

-source release

     

指定接受的源代码版本。以下值   允许发布:

     

1.3编译器不支持在Java SE 1.3之后引入的断言,泛型或其他语言功能。

     

1.4编译器接受包含断言的代码,这些代码是在Java SE 1.4中引入的。

     

1.5编译器接受包含Java SE 5中引入的泛型和其他语言特性的代码。

     

5 1.5的同义词。

     

1.6 Java SE 6中没有引入语言更改。但是,源文件中的编码错误现在报告为错误而不是   警告与早期版本的Java平台标准版一样。

     

6 1.6的同义词。

     

1.7编译器接受具有Java SE 7中引入的功能的代码。

     

7同义词1.7。

     

1.8这是默认值。编译器接受具有Java SE 8中引入的功能的代码。

     

8 1.8的同义词。


如果未指定此参数,则它具有默认值 您可以读到1.8是默认值。
因此,编译器接受具有Java SE 8中引入的功能的源代码(当然包括1.4中的assert)。