5
public class Application {
    public static void main(String[] args) {
        final class Constants {
            public static String name = "globe";
        }
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Constants.name);
            }
        });
        thread.start();
    }
}

コンパイル エラー:The field name cannot be declared static in a non-static inner type, unless initialized with a constant expression

これに対する解決策は?

4

2 に答える 2

8

Java では、関数ローカルの内部クラス内で非 final 静的フィールドを定義することはできません。非最終的な静的フィールドを持つことができるのは、最上位クラスと静的なネストされたクラスだけです。

クラスにstaticフィールドが必要な場合は、次のようにクラス レベルに配置します。ConstantsApplication

public class Application {
    static final class Constants {
        public static String name = "globe";
    }
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Constants.name);
            }
        });
        thread.start();
    }
}
于 2013-08-30T06:10:13.687 に答える
6

JLS セクション 8.1.3から:

内部クラスは、定数変数 (§4.12.4) でない限り、またはコンパイル時エラーが発生しない限り、静的メンバーを宣言できません。

したがって、変数を作成するだけで問題ありませんfinal

public class Application {
    public static void main(String[] args) {
        final class Constants {
            public static final String name = "globe";
        }
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Constants.name);
            }
        });
        thread.start();
    }
}

もちろん、定数以外の値で初期化する必要がある場合、これは機能しません。

そうは言っても、それは珍しいデザインです、IMO。私の経験では、名前付きのローカル クラスをまったく目にすることはめったにありません。これをローカルクラスにする必要がありますか?何を達成しようとしていますか?

于 2013-08-30T06:18:33.547 に答える