Java 如何以编程方式测试断言是否已启用?

Java 如何以编程方式测试断言是否已启用?,java,scjp,assertion,ocpjp,Java,Scjp,Assertion,Ocpjp,OCP Java SE 6程序员实践考试的正确答案之一是: 您可以通过编程方式测试是否启用了其他断言 不抛出断言错误 我该怎么做呢?我想你应该使用Class.desiredAssertionStatus() 我用这个 boolean assertOn = false; // *assigns* true if assertions are on. assert assertOn = true; 我不确定这是否是“官方”方式。Oracle Java教程提供了有关如何做到这一点的信息 教程的摘

OCP Java SE 6程序员实践考试的正确答案之一是:

您可以通过编程方式测试是否启用了其他断言 不抛出断言错误


我该怎么做呢?

我想你应该使用
Class.desiredAssertionStatus()

我用这个

boolean assertOn = false;
// *assigns* true if assertions are on.
assert assertOn = true; 

我不确定这是否是“官方”方式。

Oracle Java教程提供了有关如何做到这一点的信息

教程的摘录

七,。为什么不提供一个构造来查询包含类的断言状态

这样的构造将鼓励人们内联复杂的断言 代码,我们认为这是一件坏事。此外,这是直接的 如果您认为必须:

boolean assertsEnabled = false;
assert assertsEnabled = true; // Intentional side-effect!!!
// Now assertsEnabled is set to the correct value

也许可以帮助某人。

我正在使用jdk.nashorn.internal中的AssertsEnabled

System.out.println(AssertsEnabled.assertsEnabled());
// "assertsEnabled()" returns boolean value

也许这对某人有帮助。

每次
true
都是
false
;)看看@Joe的回答,显然也是“官方”方式。他们甚至称之为“直截了当”,所以请再次删除你的评论,@PeterLawrey:我不确定这是“官方”方式——不是。2不知道Java中的核心类(自1.4版起)很好。desiredAssertionStatus()@Thilo,这不是官方的方法,它是
类中定义良好的API函数。这避免了另一种方法可能带来的“意外赋值”警告。实际上,从javadoc:请注意,此方法不能保证返回在初始化(或将要初始化)时与指定类关联的实际断言状态。“所以这个答案对我来说似乎是不正确的,你应该考虑乔的答案。”FBB,我猜应该安全地从你正在测试的类的一个实例中调用这个方法(因为该类保证被初始化)。@ GILI:当它被初始化时。因此,不,javadoc声明它是不安全的,即使类已正确初始化。@FBB另一个答案也有完全相同的问题,它只检查断言在评估(或未评估)断言时是否启用。断言可以根据类和包启用,并且可以通过插装进行更改。
package io.github.baijifeilong.tmp;

import io.vavr.control.Try;

/**
 * Created by BaiJiFeiLong@gmail.com at 2019-04-18 09:12
 */
public class TmpApp {

    public static void main(String[] args) {
        Try.run(() -> {
            assert false;
        }).onSuccess($ -> {
            throw new RuntimeException("Assertion is not enabled");
        });
    }
}
System.out.println(AssertsEnabled.assertsEnabled());
// "assertsEnabled()" returns boolean value