5

私は Set クラスを持っています (これは J2ME なので、標準 API へのアクセスは制限されています。私の明白な車輪の再発明を説明するためです)。セットクラスを使用して、クラスとサブクラスで定数セットを作成しています。なんかこんな感じ…

class ParentClass
{
    protected final static Set THE_SET = new Set() {{
        add("one");
        add("two");
        add("three");
    }};
}


class SubClass extends ParentClass
{
    protected final static Set THE_SET = new Set() {{
        add("four");
        add("five");
        add("six");
        union(ParentClass.THE_SET); /* [1] */
    }};
}

[1] の行でヌル ポインター例外が発生することを除いて、すべて問題ないように見えます。おそらくこれは、サブクラスの静的イニシャライザーが親クラスの前に実行されていることを意味します。インスタンス化されたサブクラスで実行する前に、最初に新しいインポートで静的ブロックを実行すると思っていたので、これは私を驚かせました。

私はこの仮定で正しいですか?この動作を制御または回避する方法はありますか?

アップデート:

物事はさらに奇妙です。代わりにこれを試しました(「new ParentClass()」行に注意してください):

class ParentClass
{
    public ParentClass()
    {
        System.out.println(THE_SET);
    }

    protected final static Set THE_SET = new Set() {{
        add("one");
        add("two");
        add("three");
    }};
}


class SubClass extends ParentClass
{
    protected final static Set THE_SET = new Set() {{
        System.out.println("a");
        new ParentClass();
        System.out.println("b");
        add("four");
        System.out.println("c");
        add("five");
        System.out.println("d");
        add("six");
        System.out.println("e");
        union(ParentClass.THE_SET); /* [1] */
        System.out.println("f");
    }};
}

そして出力は奇妙です:

a
["one", "two", "three"]
b
c
d
e
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException

したがって、ParentClass は初期化されますが、サブクラスはその静的初期化子でそれにアクセスできません。

4

6 に答える 6

3

クラス間の静的初期化子の順序は保証されません。クラス内では、ソース コードの順序で実行されます。

考えてみると、クラスがロードされるタイミングも制御できないため、クラス間の順序はあり得ません。クラスを動的にロードする場合や、JVM がロード順序を最適化する場合があります。

于 2009-04-27T13:11:28.123 に答える
0

["one", "two", "three"] という出力行を考えると、ParentClass.THE_SET が初期化されていないということは基本的にあり得ません。

もちろん、関連するクラスローダが 1 つだけではない可能性もありますが、null ポインタが発生するメソッドと行番号を確認することは確かに役立ちます。

于 2009-04-27T13:36:22.790 に答える
-1

Java puzzles book や Google の YouTube video about java tricks に似たようなことが書かれていると思います。

于 2009-04-27T18:36:55.577 に答える