2016-08-18 14 views
0

私はGoのものにそのような変数を持ち、Javaと同じようにしようとしています。キー> Javaの値ペア配列

var (
    STATUS = map[int]string{ 
     200: "OK", 
     201: "Created", 
     202: "Accepted", 
     304: "Not Modified", 
     400: "Bad Request", 
     401: "Unauthorized", 
     403: "Forbidden", 
     404: "Not Found", 
     405: "Resource Not Allowed", 
     406: "Not Acceptable", 
     409: "Conflict", 
     412: "Precondition Failed", 
     415: "Bad Content Type", 
     416: "Requested Range Not Satisfiable", 
     417: "Expectation Failed", 
     500: "Internal Server Error", 
    } 
) 

私はHashMapまたは他の配列のものを使用しようとしましたが、それはResponseクラスのプロパティになることができませんでしたCoSおよびなどの冒頭で定義する必要があります。

package http; 

class Response { 
    // here define filling it e.g STATUS = new Array(200, "OK", ...) etc.. 
    ... STATUS ... 
} 

はい、私はHashMapを使用して、コンストラクタでそれを埋めることができますが、私はこのような例えば、「OK」を取得することはできません:String status = STATUS[200]を。

+0

Javaには、連想配列を直接初期化する方法がありません。ループなどを使用する必要があります。 http://stackoverflow.com/questions/24922011/add-multiple-string-variables-to-arraylist/24922034#24922034 – markspace

+0

これに最も適した構造は、文字列へのint型の 'enum'マッピングです。これは例です:http://stackoverflow.com/questions/10661775/java-custom-enum-value-to-enum –

+0

まあ、 'enum'sはOKですが、しばしば扱いにくいです。私は最良の構造は外部ファイルだと思うので、再コンパイルせずに新しい(または廃止予定の)リターンコードを簡単に設定することができます。それは 'enum'を排除します。 – markspace

答えて

1

静的なクラス初期化子を使用して、試したようなHashMapを使用できます。

class Response 
{ 
    public static final Map<Integer,String> STATUS; 

    static{ 
     STATUS=new HashMap<>(); 
     STATUS.put(200,"OK"); 
     STATUS.put(201,"Created"); 
     // ... 
    } 
} 

使用例:

Response.STATUS.get(200); // will return "OK" 



必要であれば、あなたも)(Collection.unmodifiableMapと、それは変更不可能にすることができます。それが私のやり方です。だから、上から静的クラス初期化子は現在、次のようになります。

static{ 
    HashMap<Integer,String> statusValues=new HashMap<>(); 
    statusValues.put(200,"OK"); 
    statusValues.put(201,"Created"); 
    // ... 

    STATUS=Collections.unmodifiableMap(statusValues); 
} 
+0

@Gregaありがとう、私はそれをチェックさせてください。 –

+0

あなたは何を見つけましたか? – GregaMohorko

+0

何も、私はそれを許し、私の構造を変えた。ありがとう@グレガ。 –

2

enumは、最高のスーツになります。

public enum Response { 
    OK(200, "OK"), 
    Created(201, "Created"), 
    NotFound(404, "Not found"); 

    private final int _code; 
    private final String _message; 

    Response(int code, String message) { 
    _code = code; 
    _message = message; 
    } 

    public int code() { 
    return _code; 
    } 

    public String message() { 
    return _message; 
    } 
} 
列挙型の

追加の利点は、あなたがコードで分かり定数名で動作するということです、数値コードではなくResponse.NotFoundなどです。実際にコードで値を取得する必要がある場合は、静的メソッドを追加してenumインスタンスを解決してください。

+0

ありがとうございました@Oleg、私はそれをチェックさせてください。 –

関連する問題