-3

これが私のコードです:

public class Test  {
    private static int NN;

    public Test (int N) {
       NN = N;
    }  

   public static void main(String[] args)  {
       Test t = new Test (N);
       int l = NN;
       for (i = 0; i < l; i++) {
           // do my loop
       }
   }
}

私がやりたいことは、コンストラクターから "N" を取得し、それを main() で使用できる変数に渡すことですが:

a) この方法で実行すると、findbugs の警告が表示されます。

M D ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD ST: Write to static field...

b) 「NN」を静的にしないと、コンパイルされません

c) プライベート変数 (NN) のゲッター/セッターを作成すると、API が破損します。

4

2 に答える 2

2

main() は、プログラムへのエントリ ポイントです。JVM によって呼び出されたときに Test 型のオブジェクトはまだないため、コンストラクターはまだ呼び出されていません。そのため、main() は静的であり、アクセスするフィールドも静的でなければなりません。

あなたが解決しようとしている問題は何ですか?N とは何ですか? どこから来たのですか?

コマンドラインから取得した場合は、args 配列の文字列として見つかります。次に、それを整数に変換する必要があります(エラー処理を気にしない場合は Integer.valueOf() が適しています)、それを使用します。

于 2013-02-13T01:48:12.777 に答える
1

コンストラクターで変数Write to static field...を割り当てているため、ファイアバグの警告を修正するには、次を使用します。staticNN

public Test (int N) {
   Test.NN = N;
}

変数setter/getterを書きたくない場合; 実行時にアクセスするためにNN使用することを検討してくださいreflection

于 2013-02-13T01:52:40.793 に答える