10

引数を使用して静的クラスを初期化し、そのクラスでさらに静的コードを実行しようとしています。
私はstaticブロックを認識していますが、引数を取ることはできないようです。
静的コンストラクターに引数を渡す方法はありますか?
そうでない場合、引数を使用して静的クラスを初期化するための推奨される手法は何ですか?

編集: 私の理解では、静的クラスはインスタンス化できないクラスです(Javaに別の用語がある場合、C#では静的クラスと呼ばれます。認識していないことをお詫びします)-それはむしろクラス名を介してアクセスされますオブジェクト名よりも。

私が達成しようとしている (非常に単純化された) のは、辞書を文字列として受け取り、それを解析し、メソッドで .xml のように操作するクラスGetRandomEntryです。

これが私のコードの詳細なスニペットです:

public class QuestionsRepository {  
private static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>();  

//...  

static 
    {  
    // need to receive and parse dictionary here    
    }  
//...   

コード スニペットの関連部分を取得することは決して簡単ではありません。賢明に選択したことを願っています (:
関連する可能性のある別の詳細 - 私は通常 ac# プログラマーです。最近 Java の学習を始めたばかりです。

ありがとう。

4

6 に答える 6

16

入力に従ってクラスの静的フィールドを初期化する必要があると思います。別のクラスの静的メソッドを呼び出すことにより、次の方法でそれを行うことができます。

class ClassToInitialize {
    static {
        staticField = ParamPassClass.getParameter();
    }

    private static String staticField;

    ClassToInitialize() {
        System.out.println("This is the parameter: " + staticField);
    }

}

class ParamPassClass {
    private static String parameter;
    static String getParameter() {
        return parameter;
    }

    static void setParameter(String parameter) {
        ParamPassClass.parameter = parameter;
    }
}

class Main {
    public static void main(String args[]) {
        ParamPassClass.setParameter("Test param");
        new ClassToInitialize();
    }
}
于 2012-01-29T10:44:20.523 に答える
3

Java には静的コンストラクターがありません。静的初期化子のみがあり、静的初期化子は引数を取りません。クラスが最初にロードされたときに実行され、自分で呼び出す方法はありません。

実際のオブジェクトを使用するか、クラスを構成する何らかの方法を追加する必要があります (たとえば、静的メソッドを使用)。

于 2012-01-29T10:33:57.330 に答える
1

静的修飾子を使用してメンバー クラスに言及する必要があります。そうしないと、静的クラスなどというものは存在しません 。ここでは、このコンテキストで「静的」という言葉を使用する説明を見つけることができます。

ここで、そのコンストラクターを呼び出して、必要なすべての引数を渡す必要があります。静的メンバー クラスに対する唯一の制限は、外部クラスの非静的フィールドを参照できないことです。クラスの静的メソッドに似ています。クラスの非静的フィールドを参照できません。

ここで静的初期化ブロックについて言及している理由がわかりませんでした。少し明確にしていただけますか? Javaには静的コンストラクターなどがないことにも注意してください....

お役に立てれば

于 2012-01-29T10:34:28.350 に答える
0

public static void setUp(Arg1 arg1, Arg2 arg2...)すべてのフィールドを設定しstatic、プログラムの開始時に呼び出す静的メソッドを作成できます。

このメソッドが一度だけ呼び出されることを確認する必要があります [またはこれらのフィールドをリセットしたい場合のみ]

于 2012-01-29T10:37:43.550 に答える
0

静的初期化 ( JLS:static initializers )に引数を直接渡すことはできません。

あなたの目標についてもっと情報を共有できればうれしいです。

于 2012-01-29T10:38:11.433 に答える
0

列挙型を使用して、次のような文字列パラメーターでシングルトンを初期化できます

import java.util.*;
class Data {
    static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>();  
}
public enum QuestionsRepository
{
    repository("primary=red,green,blue;secondary=cyan,yellow,magenta"); 
    QuestionsRepository(String dictionary) {
        String[] rules = dictionary.split(";");
        for (String rule:rules) {
            String[] keyValuePair = rule.split("=",2);
            Data.easyDefinitions.put(keyValuePair[0],keyValuePair[1].split(","));
        }
    }
}
于 2013-04-05T07:37:37.473 に答える