1

我有一个遗留应用程序,我正在尝试将其从 JDK8 转换为 JDK12。我遇到麻烦的地方之一是以下代码......

import jdk.nashorn.internal.ir.annotations.Immutable;

import java.util.Base64;

@Immutable // <-here
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public final class Application {
    ....
}

当我尝试使用 IntelliJ 构建时,我得到...

错误:(6, 43) java: 包 jdk.nashorn.internal.ir.annotations 不存在

错误:(10, 2) java: 找不到符号 symbol: class Immutable

该代码不容易理解,我不确定它的用途,但快速的 Google 搜索表明它允许 Java 运行 ES5。它似乎也已被弃用,并将很快被删除。最后是 ES5 而不是 ESNext,所以我想使用一些更新的东西。

  1. 这是用来做什么的(我猜是 JSON 序列化,但为什么不使用 GSON 或 Jackson?)
  2. 我可以用与 Java 12+ 兼容的东西来替换它吗?

如果我将其删除,则以下测试将失败...

@Test
public void equalsTest() {
    EqualsVerifier.forClass(EvaluationResult.class).verify();
}

带有以下错误消息...

[ERROR]   EvaluationResultTest.equalsTest:42 Mutability: equals depends on mutable field id.
For more information, go to: http://www.jqno.nl/equalsverifier/errormessages
4

1 回答 1

1

对EqualsVerifier的搜索出现了有关其不变性概念的文档。

如果您无法使字段成为最终字段,但您绝对确定该类是不可变的,则可以@Immutable向该类添加注释。注释来自哪里并不重要;你甚至可以自己写一个,只要它叫Immutable.

所以看起来 Nashorn@Immutable注释只是为了方便而使用,任何同名的注释都可以,即使是在您自己的项目中定义的注释:

package my.legacy.project.annotations;

/**
 * Tag for classes that are immutable.
 */
public @interface Immutable {
    //empty
}

或者,如果您可以制作EvaluationResult它包含的所有对象的所有字段和字段final,则文档表明不需要注释,但如果需要与 JSON 一起使用,您可能无法使其Application不可变,具体取决于使用的 JSON 库。

于 2020-05-12T18:34:40.880 回答