我有一个旧版应用程序,正在尝试将其从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,所以我想使用一些新的东西。
如果我将其删除,则以下测试失败...
@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
对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库。