5

我正在尝试使用 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.FileCloneable但我对这个解决方案不满意。以下代码可以编译和工作,但拥有自己的子类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.Colorjava.net.URI

4

1 回答 1

12

您是否尝试过使用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

)

于 2013-01-07T03:07:45.170 回答