Groovy@Immutable类,具有(im)可变属性
我试图使用GroovyGroovy@Immutable类,具有(im)可变属性,groovy,immutability,Groovy,Immutability,我试图使用Groovy@Groovy.transform.Immutable来实现具有不受支持的“不可变”类型属性的类。在我的例子中,它是java.io.File 例如,像这样上课 @groovy.transform.Immutable class TwoFiles { File file1,file2 } 给我以下编译错误 Groovyc:@Immutable processor在编译类文件时不知道如何处理“java.io.File”类型的字段“file1”。 @不可变类仅支持具有有
@Groovy.transform.Immutable
来实现具有不受支持的“不可变”类型属性的类。在我的例子中,它是java.io.File
例如,像这样上课
@groovy.transform.Immutable class TwoFiles {
File file1,file2
}
给我以下编译错误
Groovyc:@Immutable processor在编译类文件时不知道如何处理“java.io.File”类型的字段“file1”。
@不可变类仅支持具有有效不可变类型的属性,包括:
-字符串、基元类型、包装类型、BigInteger和BigDecimal、枚举
-其他@Immutable类和已知的不可变类(java.awt.Color、java.net.URI)
-可克隆类、集合、映射和数组,以及其他具有特殊处理的类(java.util.Date)
其他限制适用,请参阅groovydoc for@Immutable以了解更多详细信息
我发现有一个选项是扩展java.io.File
,使其可克隆
,但我对这个解决方案不满意。下面的代码可以编译并工作,但是拥有自己的java.io.File
子类并不是我想要的
@groovy.transform.Immutable class TwoCloneableFiles {
FileCloneable file1,file2
class FileCloneable extends File implements Cloneable{
FileCloneable(String s) {
super(s)
}
// ... and other constructors ...
}
}
所以我的问题是:在这样的类中,有没有其他选项可以直接使用java.io.File
为了@groovy.transform.immutable
(与java.awt.Color
,java.net.URI
)的目的,可能将java.io.File
标记为“已知不可变”?您是否尝试使用来指定文件
?像这样的方法应该会奏效:
@groovy.transform.Immutable(knownImmutableClasses = [File])
class TwoFiles {
File file1,file2
}
(使用文件
,您可能还可以通过以下方式获得想要的效果:
@groovy.transform.Immutable
class TwoFiles {
String file1,file2
public File getFile1() {return new File(file1)}
public File getFile2() {return new File(file2)}
}
def f = new TwoFiles("/", "/Users")
assert f.file1.class == File
)KnownimMutableClass正是我所需要的。我只需要更新到Groovy 1.8.7+,因为这个参数是在这个版本中引入的(到目前为止,我使用的是1.8.6:)