2016-09-09 9 views
2
class InitializationTest { 
    abstract class Base { 
    method() 
    def method(): Unit 
    } 

    class Subclass extends Base { 
    val obj = new Object 
    override def method(): Unit = { 
     println(obj) // null 
     // How to get the Object here? 
    } 
    } 

    @Test 
    def doTest(): Unit = { 
    new Subclass() 
    } 
} 

を初期化したときのメンバーにアクセスし、println(obj)表現ます。スカラ座、私は実験として、オブジェクトが

methodのobjにアクセスする必要がある場合は、Subclassという質問になります。 valからvarに変更する必要がありますか?できません。

ありがとうございました。

+2

このように 'method'を呼び出す理由がわからなければ、即座に回避するには' val'を 'lazy'と宣言することです – cchantep

答えて

3

objlazy valと定義することです。

class Subclass extends { 
    val obj = new Object 
} with Base { 
    override def method(): Unit = { 
    println(obj) // not null! 
    } 
} 

これらのソリューション(およびいくつかの他は)hereを見つけることができます:

もう一つは早期の定義を使用しています。

1

あなたが早期に初期化が必要

class Subclass extends { 
    val obj = new Object 
} with Base { 
    override def method(): Unit = { 
     println(obj) 
    } 
} 

あなたのコードでは、OBJのためのヌルのアクセスにつながる「サブクラスのコンストラクタを実行し、ベースのコンストラクタを実行する」コンパイラーに指示します。

私が書いたコードは、「名前のない拡張を実行し、次にBaseのコンストラクタを実行してから、サブクラスのコンストラクタを実行する」ため、objは名前のない拡張で初期化されます。それにアクセスする機会を得る。