首页 文章

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

提问于
浏览
4

我正在尝试使用Groovy @groovy.transform.Immutable 来实现具有不受支持的"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)其他限制适用,请参阅groovydoc for @Immutable以获取更多详细信息

一个选项我发现它扩展 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

@groovy.transform.Immutable 的目的,可能将 java.io.File 标记为"known immutable"(与 java.awt.Colorjava.net.URI 似乎相同)?

1 回答

  • 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
    

相关问题