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

时间:2013-01-06 19:00:47

标签: groovy immutability

我正在尝试使用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.Colorjava.net.URI似乎相同)?

1 个答案:

答案 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