gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:03:50 30 4
gpt4 key购买 nike

我正在尝试使用 Groovy @groovy.transform.Immutable实现具有不支持的“不可变”类型属性的类。就我而言,它是 java.io.File

例如,有这样的类(class)

@groovy.transform.Immutable class TwoFiles {
File file1,file2
}

给我以下编译错误

Groovyc: @Immutable processor doesn't know how to handle field 'file1' of type 'java.io.File' while compiling class TwoFiles. @Immutable classes only support properties with effectively immutable types including: - Strings, primitive types, wrapper types, BigInteger and BigDecimal, enums - other @Immutable classes and known immutables (java.awt.Color, java.net.URI) - Cloneable classes, collections, maps and arrays, and other classes with special handling (java.util.Date) Other restrictions apply, please see the groovydoc for @Immutable for further details

我发现它可以扩展 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 直接在这样的类(class)中?

可能要标记java.io.File出于 @groovy.transform.Immutable 的目的“已知不可变” (与 java.awt.Colorjava.net.URI 的做法似乎相同)?

最佳答案

您是否尝试过使用 knownImmutableClasses指定文件?像这样的东西应该有效:

@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

)

关于具有 (im)mutable 属性的 Groovy @Immutable 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14185625/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com