Java 断言的替代方案

Java 断言的替代方案,java,junit,assert,assertions,Java,Junit,Assert,Assertions,我不满意Java中assert关键字的原因是 1) 它在默认情况下是禁用的,因此在我希望启用它时确保它处于启用状态是一件令人头疼的事情 2) 它的行为相当严格(理想情况下,我想要一些控制反转);但这并不十分重要 我可以考虑的一些备选方案: JUnit的assertEquals()等-适用于测试,但不能在主代码中使用 番石榴的先决条件——很好,但本质上没有断言方法 我自己的断言库——我在1999年写的,当时它很棒,但现在我想标准化 还有别的吗 所以。。总而言之。。如何在生产代码中以默认情况下不禁用

我不满意Java中assert关键字的原因是

1) 它在默认情况下是禁用的,因此在我希望启用它时确保它处于启用状态是一件令人头疼的事情

2) 它的行为相当严格(理想情况下,我想要一些控制反转);但这并不十分重要

我可以考虑的一些备选方案:

  • JUnit的assertEquals()等-适用于测试,但不能在主代码中使用
  • 番石榴的先决条件——很好,但本质上没有断言方法
  • 我自己的断言库——我在1999年写的,当时它很棒,但现在我想标准化
  • 还有别的吗
  • 所以。。总而言之。。如何在生产代码中以默认情况下不禁用的方式进行断言

    (是的,有些人可能会认为这是一种反模式,但我确实希望在生产中至少有一些断言,即使断言失败只是以静默方式记录。即使在收缩包装中,我也看到了这样做的空间,当然在网站中也是如此)

    JUnit的assertEquals()等-适用于测试,但不能在主代码中使用

    从技术上讲,没有什么可以阻止您在主代码中使用JUnit资产(和/或Hamcrest匹配器)。只需在类路径中包含Junit jar。通常不会这样做,但这更像是一种惯例,而不是任何技术限制

    Java7还引入了
    Objects.requirentnull(obj,message)
    和类似的方法,尽管不如JUnit断言功能齐全


    但我认为如果你想采用更标准化的方法,番石榴的先决条件可能是最好的。

    我会使用Spring的类,它包括相当广泛的检查范围。

    我不确定这是否是你想要的,但我已经习惯性地使用
    commons lang
    很多年了。通常在公共API方法/构造函数中,以确保正确传递参数。不仅仅是
    notNull
    (参见Lombok的相关内容),还有
    noNullElements

    我特别喜欢不可变的
    T notNull(T对象)
    签名:

    private final JSCodeModel codeModel;
    private final String name;
    
    public FunctionDeclarationImpl(JSCodeModel codeModel, String name,
            String[] parameterNames, JSSourceElement[] sourceElements) {
        this.codeModel = Validate.notNull(codeModel);
        this.name = Validate.notNull(name);
        ...
    }
    

    实际上,您的要求是什么?

    您试过了吗?@StackFlowed刚刚查阅了reflections asserter-整洁!但是如果我只想要一个简单的fail()或assert(布尔值),该怎么办?还有,现在的反思有多快?我记得它们非常慢,但这一定已经改变了。而且——我真的很喜欢Scala风格的“应该”——断言,而不是“断言”。有这样的库吗?我不知道性能如何。如果你需要一些简单的东西,那么我认为性能不重要。如果这个问题不再被搁置(我当然希望如此),我将把它变成一个答案:
    If(development&!DebugHelpers.isAssertEnabled())抛出新的RuntimeException(未启用断言。定义“开发”时,请确保使用-enablessertions(-ea)运行
    很有趣!它可以与春季的其他时间分开使用吗?它会增加我的占地面积多少?我知道这是一个惯例,但这是一个主要惯例。考虑到替代方案,仅为assert语句在生产中进行单元测试似乎有些过分。这不完全是我想要的(但可能是因为,正如你所说,我没有说清楚),但绝对适合普通教育,谢谢!我想要控制反转,真的!就像Log4j可以记录几乎任何地方一样,我希望我的异常处理程序可以做几乎任何事,无论我提供什么功能:弹出调试器(Eclipse),弹出窗口,写入日志文件,通过网络发送消息,允许远程调试器连接,导致错误页面。无论如何,这就是我的旧框架所做的;但正如我所说,我想标准化@titааааtit。这是一个非常不同的问题。我们有一个自定义解决方案(覆盖在Log4j上,直接和基于AOP的集成以及基于UDP的Icinga监控传输等等)。这是一个专有的解决方案,但是一个内部标准。(我在一家大公司工作。)听起来贵公司的解决方案和我的类似。虽然AOP已经在我的名单上很长时间了,但我从来没有抽出时间来做过(矿山开采时间早于AOP),所以我的只是捕获了所有异常,并将它们发送给实现IoC的异常处理程序;断言也是如此。但很难向新雇主/客户推销。如果你不介意我问的话,你的标准API在接口级别上是什么样子的?顺便说一句,很高兴见到你的同胞。@titааааtit。我不认为它类似。在(Java)上API级别我们有“非结构化”和“结构化”情况。非结构化与Log4j日志API非常相似。结构化情况在“情况目录”中是预定义的(每个应用程序),我们生成的API类似于
    MyAppCatalog.someProblem(P1参数1,P2参数2)
    .AOP是不同的,但我没有在我的项目中使用它,也说不出什么。这是一个巨大的主题。