我如何在Java 12中迁移nashorn代码?

问题描述 投票:1回答: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:找不到符号符号:class不可变

该代码不容易理解,我不确定该代码的用途,但是谷歌的快速搜索表明它允许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
java nashorn
1个回答
1
投票

EqualsVerifier的搜索提供了有关immutability概念的文档。

如果您无法将字段定为最终字段,但绝对可以确定该类是不可变的,则可以向该类添加@Immutable批注。注释来自哪里都无所谓;您甚至可以自己写一个,只要叫Immutable

因此,似乎Nashorn @Immutable注释只是为了方便起见,并且具有相同名称的任何注释也可以使用,即使在您自己的项目中定义了一个注释:

package my.legacy.project.annotations;

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

或者,如果您可以将EvaluationResult的所有字段和包含它的所有对象的字段设为final,则说明文档将不需要注释,但是您可能无法使Application不可变是否需要与JSON一起使用,取决于所使用的JSON库。

© www.soinside.com 2019 - 2024. All rights reserved.