Groovy@Immutable类,具有(im)可变属性

Groovy@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
@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:)