我有一个遗留应用程序,我正试图将它从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:找不到符号符号:类不可变
这段代码不容易理解,我也不知道它是用来做什么的,但是谷歌搜索表明它允许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发布于 2020-05-12 18:34:40
对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库。
https://stackoverflow.com/questions/61757406
复制相似问题