2

私の Android アプリでは、列挙型を使用して特定の API エンドポイントを定義しています。

public static enum API_ENDPOINT{
        MISSION, FEATURED_MEDIA
}

列挙型は、API 呼び出しの種類に依存するメソッドの適切な引数のようですが、さまざまな言語で構成されたデバイス間で、列挙型を一貫した文字列 (つまり、API エンドポイント URL へのマッピング) に変換することができません。

トルコ語のAPI_ENDPOINT.values()戻り値:mıssıon, featured_medıa

英語で次のAPI_ENDPOINT.values()ように返します。mission, featured_media

API_ENDPOINT明らかな解決策は、ハードコードされた文字列エンドポイントにマップする追加のデータ構造ですが、この動作enum.values()が意図されているかどうか、および/または回避できるかどうかについては興味があります。

解決済み: 洞察をありがとう。Locale を指定せずAPI_ENDPOINTに使用した URL 文字列に変換するロジックがさらに深くなると、望ましくない動作が発生します。String.toLowerCase()これはString.toLowerCase(Locale.US)

4

2 に答える 2

2

2 つのプロパティ ファイルを定義できます。1 つは英語用、もう 1 つはトルコ語用です。
Enum は次のようになります。

public static enum API_ENDPOINT{
    MISSION("path.to.property.mission"), FEATURED_MEDIA("path.to.property.featured_media");

    private String propertyName;
    API_ENDPOINT(String propertyName){
        this.propertyName = propertyName;
    }

    // language could also be an enum which defines the language to be taken
    // and should contain the path to the file.
    public String getTranslatedText(Language language){
        Properties prop = new Properties();

        try {
            //load a properties file from class path
            prop.load(API_ENDPOINT.class.getClassLoader().getResourceAsStream(language.getPropertyFileName()));

            //get the translated value and raturn it.
            return prop.getProperty(propertyName);

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

プロパティ ファイルは次のようになります (英語):

path.to.property.mission=Mission
path.to.property.featured_media=Featured Media

トルコ語も同様です。それが役立つことを願っています。

編集:Androidを使用しているため、これが問題の解決策になる可能性があります:

于 2013-10-30T18:28:42.140 に答える
2

追加のデータ構造なしで、列挙型の一部として文字列をハードコーディングできます。

public static enum API_ENDPOINT{
    MISSION("mission"), FEATURED_MEDIA("featured_media");
    private final String value;
    API_ENDPOINT(String value) { this.value = value; }
    public String value() { return value; }
}

しかし、自動生成された表現を制御する方法があればいいのですが。

JLS enum セクションでは、このような言語の違いについて直接説明していませんが、出力が enum 識別子と完全に一致することを強く示唆しています。小文字の文字列に大文字の識別子が含まれていることに驚きました。


さらにテストした結果、これは再現できません。コードで何か他のことが起こっているに違いありません。

この最小限のプログラムは、ロケールに関係なく、入力されたとおりに列挙型識別子を表示します。

public class MainActivity extends Activity {
    public enum ENUM {
        MISSION, FEATURED_MEDIA
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView textView = (TextView) findViewById(R.id.text);
        String enums = "";
        for (ENUM e : ENUM.values()) {
            enums += e + " ";
        }
        textView.setText(enums);
    }
}
于 2013-10-30T18:32:26.583 に答える