2009-06-04 2 views
4

私は親クラスと子クラスを持っています。親クラスのコンストラクタでは、次のコードのようにクロージャを使用して親クラスのフィールドの値を設定しようとしています。 「:クラスの値:ChildClassそのようなプロパティ」私はこのコードを実行するとGroovyの親子プライベートフィールドのクロージャによる奇妙なアクセス

try { 
    def x = new ChildClass() 
} catch (ex) { 
    ex.printStackTrace(System.err) 
} 

class ParentClass { 
    private values = [] 

    ParentClass(columnCount) { 
    columnCount.times { values.add('') } 
    } 
} 

class ChildClass extends ParentClass { 
    ChildClass() { 
    super(20) 
    } 
} 

はしかし、私はメッセージでgroovy.lang.MissingPropertyExceptionを取得します。しかし、親クラスのコンストラクタを変更して、この例のようにtimesメソッドでクロージャを使用しない場合:

try { 
    def x = new ChildClass() 
} catch (ex) { 
    ex.printStackTrace(System.err) 
} 

class ParentClass { 
    private values = [] 

    ParentClass(columnCount) { 
    def i 
    for (i = 0; i < columnCount; i++) { 
     values.add('') 
    } 
    } 
} 

class ChildClass extends ParentClass { 
    ChildClass() { 
    super(20) 
    } 
} 

これは機能します。誰かが私にこの行動を説明できますか?なぜGroovyが値フィールドが子クラスのプロパティだと考えるのか分かりません。私はGroovyのバージョン "Groovy Version:1.6.3 JVM:1.5.0_18"を使用しています。

答えて

4

これはGroovyの現在のバージョンの既知のバグであり、Groovy 2.0で修正される予定です。 GROOVY-3073を参照してください。

最初の例のクロージャがプライベートクラスレベルの変数を見ることができないメタクラスのスコープのバグが原因で起こっています。

この状況で問題を回避する可能性のある修正は、スーパークラスにローカルエイリアス変数を宣言することです。これは、クロージャのスコープの問題を回避します。コンストラクタを次のように変更します。

ParentClass(columnCount) { 
    def valueAlias = values 
    columnCount.times { valueAlias.add('') } 
    } 
関連する問題