gpt4 book ai didi

Java 7 构造函数

转载 作者:IT老高 更新时间:2023-10-28 20:35:17 25 4
gpt4 key购买 nike

我看到在Java 7中,他们引入了方法Objects.requireNonNull(T obj, String message) .

Checks that the specified object reference is not null and throws a customizedNullPointerExceptionif it is. This method is designed primarily for doing parameter validation in methods and constructors with multiple parameters.

在开始重新格式化我的代码之前,我会在这里询问有关使用它的一些反馈。

 public Foo(Bar bar, Baz baz) {
/** Old one
this.bar = bar;
this.baz = baz;
**/
this.bar = Objects.requireNonNull(bar, "bar must not be null");
this.baz = Objects.requireNonNull(baz, "baz must not be null");
}

在我构建对象时直接使用它是不是更好的做法(我在考虑是否为开发人员创建一个库或其他东西)?

或者我应该将其保留为“经典/旧”构造函数?

最佳答案

如您所见,是否应该抛出 NPE 或其他异常存在分歧1

如果您接受 NPE 比替代方案更合适,并且这是 null 明确不正确的情况,那么:

  • 最好早点扔NPE;即在构造函数中,并且
  • 最好用自定义异常消息抛出它;即不是 JVM 抛出 NPE 时发生的 null

在这种情况下,使用 Objects.requireNonNull 显然是一种很好的做法。


您也可以为此使用Java 断言,但是您需要判断测试可以关闭是好事还是坏事。您必须考虑关闭提前检查所带来的性能优势是否超过了不提前检查可能导致的问题。例如,假设您在生产中看到一个 NPE 关闭了断言……您无法诊断它。你打开断言吗?断言会改变代码的行为吗?它会减慢您的系统速度(由于许多其他断言检查)吗?触发 NPE 的情况是否可能再次发生?

(与线程相关的错误通常是“千载难逢”的事情,非常难以重现。我认为您需要信息来诊断问题的任何时候......已启用断言检查。)


向后兼容性参数可能是相关的。但是,作为一般规则,您不要编写代码以在旧的 Java 平台上运行。如果您有 特定 要求来支持旧版本的 Java ...那就不同了。但如果是这种情况,您根本不应该针对 Java 7 API 进行开发......所以您的编译器/IDE 应该将 Objects 类标记为编译错误。

(将自己限制为仅在不需要时使用旧 API 会使您的代码质量受到影响,并使其更早“过时”。新东西的重点是为了让编写可靠/可维护的应用程序变得更容易。故意不使用它是……不正当的。想象一下,如果你将自己限制在 Java 1.1 中……)


1 - FWIW,我认为 NPE 还不错。并且带有消息的 NPE 比(比如说)IllegalArgumentException 更具体,并且在 Java 标准类库中有很多关于构造函数等的先例,记录为抛出 NPE。此外,这种方法显然是为这种方式设计的。

关于Java 7 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16429491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com