我正在尝试使用Groovy @groovy.transform.Immutable
来实现具有不受支持的“不可变”类型属性的类。就我而言,它是java.io.File
例如,有类
@groovy.transform.Immutable class TwoFiles {
File file1,file2
}
给我以下编译错误
Groovyc:@Immutable处理器在编译类TwoFiles时不知道如何处理'java.io.File'类型的字段'file1'。 @Immutable类仅支持具有有效不可变类型的属性,包括: - 字符串,原始类型,包装类型,BigInteger和BigDecimal,枚举 - 其他@Immutable类和已知的不可变类(java.awt.Color,java.net.URI) - 可克隆的类,集合,映射和数组,以及其他具有特殊处理的类(java.util.Date) 其他限制适用,请参阅@Immutable的groovydoc以获取更多详细信息
我发现有一个选项可以扩展java.io.File
以使其Cloneable
,但我对此解决方案不满意。以下代码编译和工作,但拥有自己的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
?
可能为了java.io.File
而将@groovy.transform.Immutable
标记为“已知不可变”(与java.awt.Color
,java.net.URI
似乎相同)?
答案 0 :(得分:9)
您是否尝试过使用knownImmutableClasses
来指定File
?这样的事情应该有效:
@groovy.transform.Immutable(knownImmutableClasses = [File])
class TwoFiles {
File file1,file2
}
(使用File
,您可能还可以通过以下方式获得所需的效果:
@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
)