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
-
-
-
- -
-
-
実行結果からもわかるように、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
-
-
-
- -
-
-
.@
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
-
-
-
- -
-
-
".@"の形式でプロパティにアクセスする場合、未定義のプロパティであれば、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
-
-
-
- -
-
-
-
-
-
- -
-
-