5

@groovy.transform.ImmutableGroovy を使用して、サポートされていない「不変」型のプロパティを持つクラスを実装しようとしています。私の場合はjava.io.File

たとえば、次のようなクラスを持つ

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

次のコンパイルエラーが表示されます

Groovyc: @Immutable プロセッサは、クラス TwoFiles のコンパイル中に、タイプ 'java.io.File' のフィールド 'file1' を処理する方法を知りません。@Immutable クラスは、以下を含む事実上不変の型を持つプロパティのみをサポートします。 、コレクション、マップ、配列、および特別な処理 (java.util.Date) を持つその他のクラス その他の制限が適用されます。詳細については、@Immutable の groovydoc を参照してください。

java.io.File1つのオプションを拡張して作成することがわかりました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

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 に答える