getPropertyとsetProperty

getPropertyとsetProperty

Groovyでは、getPropertyという名前のメソッドをクラスに定義しておくと、プロパティから値を取得する際に呼ばれるようになります。また、setPropertyという名前のメソッドをクラスに定義しておくと、プロパティに値を設定する際に呼ばれるようになります。

[ソース]
class MyClass {
    def greeting = 'accessed greeting directly'
    def properties = [:]
    Object getProperty( String property ) {
        println "read from property $property"
        properties[ property ]
    }
    void setProperty( String property, Object newValue ) {
        println "wrote to property $property"
        properties[ property ] = newValue
    }
}
def mine = new MyClass( )
println mine.greeting
println '-----'
mine.greeting= 'accessed message indirectly'
println mine.greeting

[実行結果]
read from property greeting
null
        • -
wrote to property greeting read from property greeting accessed greeting indirectly

実行結果からもわかるように、getPropertyとsetPropertyメソッド定義すると、定義済のプロパティへのアクセスはできなくなってしまいます。また、どちらかだけ定義するということもできます。

[ソース]
class MyClass {
    def greeting = 'accessed greeting directly'
    def properties = [:]
    void setProperty( String property, Object newValue ) {
        println "wrote to property $property"
        properties[ property ] = newValue
    }
}
def mine = new MyClass( )
println mine.greeting
println '-----'
mine.greeting= 'accessed message indirectly'
println mine.greeting

[実行結果]
accessed greeting directly
        • -
wrote to property greeting accessed greeting directly

.@

invokeMethodを定義した際に、".&"で定義済のメソッドを直接呼ぶことができましたが、プロパティの場合は、「"オブジェクト" ".@" "プロパティ"」という形式で呼び出すことで、定義済のプロパティに直接アクセスすることができます。

[ソース]
class MyClass {
    def greeting = 'accessed greeting directly'
    def properties = [:]
    Object getProperty( String property ) {
        println "read from property $property"
        properties[ property ]
    }
    void setProperty( String property, Object newValue ) {
        println "wrote to property $property"
        properties[ property ] = newValue
    }
}
def mine = new MyClass( )
println mine.greeting
println '-----'
println mine.@greeting

[実行結果]
read from property greeting
null
        • -
accessed greeting directly

".@"の形式でプロパティにアクセスする場合、未定義のプロパティであれば、MissingFieldExceptionが発生します。

[ソース]
class MyClass {
    def greeting = 'accessed greeting directly'
    def properties = [:]
    Object getProperty( String property ) {
        println "read from property $property"
        properties[ property ]
    }
    void setProperty( String property, Object newValue ) {
        println "wrote to property $property"
        properties[ property ] = newValue
    }
}
def mine = new MyClass( )
println mine.greeting
println '-----'
println mine.message
println '-----'
println mine.@message

[実行結果]
read from property greeting
null
        • -
read from property message null
        • -
Exception thrown: groovy.lang.MissingFieldException: No such field: message for class: MyClass