이넘 절약합니다 샤레트프레프랑스 수

궁금, 왜 내가 사용되는 일반적인 방법 '을' 샤레트프레펠릭스 저장하라는 이넘 '?' 현재 I& # 39 m ',' 다음 '를 사용하여 그슨 이넘 변환하십시오 문자열이어야 샤레트프레펠릭스' 저장합니다.

    Gson gson = new Gson();
    // country is an enum.
    String json_country = gson.toJson(country);
    sharedPreferences.edit().putString(COUNTRY, json_country);

저도 이게 궁금 좋은 방법은? 더 나은 방법이 있습니까?

단순한 문자열을 사용할 수 있는 방법을 사용하여 푸십시오 후 가치를 valueOf. 예를 들어보겠습니다.

public enum MyEnum {
    ENUM1, ENUM2, ENUM3, ENUM4;

    public static MyEnum toMyEnum (String myEnumString) {
        try {
            return valueOf(myEnumString);
        } catch (Exception ex) {
                // For error cases
            return ENUM1;
        }
    }
}

public void setMyEnum(Context context, MyEnum myEnum) {
    SharedPreferences sp = context.getPreferences(this.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.putString("MyEnum", myEnum.toString());
    editor.commit();
}

public MyEnum getMyEnum(Context context) {
    SharedPreferences sp = context.getPreferences(this.MODE_PRIVATE);
    String myEnumString = sp.getString("MyEnum", MyEnum.ENUM1.toString());
    return MyEnum.toMyEnum(myEnumString);
}

다음은 볼 수 있는 샘플 코드를 어떻게 높여줍니까 작동하잖아. https://github.com/jiahaoliuliu/SavingEnumToSharedPreferences

해설 (2)

이 같은 문제는 엔터프라이즈 자바 개발자 인쇄면 이넘 유지한 경우 데이터베이스에 대한. 이들은 기존 답변 에로남이네 약하고 리팩토링 친화적임 문제가 없습니다. # 39 에 왜 here& (대체 함께 맨 아래).

39 의 enum& 사용하는 방법 () '즉' toString () '와' valueOf can& 이넘 값을 # 39, t 바뀝니다. 예를 들어, I have a '와' 카 '와' 트럭 '이넘 페리클레티페 값뿐'. 만약 내가 문자열을 저장하는 &quot TRUCK"; '다음' 에서 '가치' 를 기본 설정으로 변경하십시오 페리클레티페스트루크 VehicleType.PICKUP_TRUCK 다음 버전의 내 앱이 더 이상 던질 수 있는 '와' 감지에서 저장됩니까 문자열이어야 이가라구멍렉세페시옹 valueOf () '은'.

39 의 값을 사용하여 value& 순서수 또는 저장된 값, 즉 t be 재정렬 이넘 can& # 39 경기 더 이상 상승했다. 이 시나리오는 예상치 못한 방식으로 동작할 수 있지만 더 앱을 실행할 수 있으므로 계속 시각이 잘 드러나 userdic. 추적할 것을 마지막으로 한 번 it& # 39 의 가능성이 높고 어려운 문제를 해결할 수 없다. 하지만 새로운 가치를 추가에는 어디든요 및끝 마찬가지입니다. 만약 내가 추가한 모터사이클 '새' a '자동차' 저장됩니까 값을 맨 위에 그 이전 버전에서 서수 (0) 로 다시 나올 것으로 보인다 '' 및 '해당 앱을 업데이트 후 오토바이, 트럭' (서수 1) a '자동차' 가 될 것 "이라고 말했다.

대체 내가 사용하는 것이 '마지막' 필드를 추가하기에서는 이넘 및 사용 등 그 가치가 있습니다.

public enum VehicleType {
    CAR("C"),
    TRUCK("T");

    private final String code;
    private static final Map valuesByCode;

    static {
        valuesByCode = new HashMap(values().length);
        for(VehicleType value : values()) {
            valuesByCode.put(value.code, value);
        }
    }

    VehicleType(String code) {
        this.code = code;
    }

    public static VehicleType lookupByCode(String code) { 
        return valuesByCode.get(code); 
    }

    public String getCode() {
        return code;
    }
}

'같은 항목을 사용하여 값을 저장하는 프레페렌세이퍼트슈타링 (,, &quot vehicle_type&quot 페리클레티페그제고데 ())' 와 '= 이 같은 항목을 사용하여 읽어들입니다 페리클레티페 페리클레티페드루쿠프비고데 (프레페렌스s.제스트링 (,, &quot vehicle_type&quot nulll)'.

그러나 이 외곽진입 单捞磐啊 제 생각이지만, 약간의 추가 코드를 it& # 39 의 가장 강력한 솔루션입니다.

해설 (5)
해결책

이 정수 및 저장할 수 있는 간단한 int, 여바바 너회의 이넘 아소리아티 수 있습니다.

또한 동일한 방식으로 할 수 있는 '에누마토린트' (두 번째 답) - https://stackoverflow.com/questions/5878952/cast-int-to-enum-in-java

해설 (1)

위의 모든 옵션 등을 고려할 때 나는 다른 솔루션 제공 문제를 활용키로 했다.

그들에 대한 일련의 값뿐만 데릭쉐퍼드와 전용 논리 없이. 이 경우 '와' '같은 툴을 사용할 수 있습니다' @IntDef @StringDef 사용하는 대신 '이넘'.

이 솔루션은 리팩터링 안전한 측면에서 주문하십시오 com/go/4e6b330a_kr 이름과 변수. 유일한 심아이엔큐 - 실제 값을 변경해서는 안 됩니다. 그러나 기본 리팩토링 도구를 won& # 39, t) 의 경우, 그대에게 변경하십시오 바꾸기 쉽지 않은 만들 수 있기 때문에 그냥 자동으로 (@IntDef '와' 에서 '관점' 이 @StringDef 것보다 낫다).

  @Retention(SOURCE)
  @IntDef({NOT_REQUESTED, GIVEN, PROHIBITED})
  public @interface CustomPermission {}

  public static final int NOT_REQUESTED = -1;
  public static final int PROHIBITED = 0;
  public static final int GIVEN = 1;

  @CustomPermission
  public int getPermission() {
    return getSharedPreferences(SHARED_PREFS_FILE)
          .getInt(STATISTICS_COLLECTION_PERMISSION, NOT_REQUESTED);
  }

  public void setPermission(@CustomPermission int flag) {
    getSharedPreferences(SHARED_PREFS_FILE)
      .edit()
      .putInt(STATISTICS_COLLECTION_PERMISSION, flag)
      .apply();
  }

Avamar 은 [공식 문서] [1]

[1]: https://developer.android.com/reference/android/support/annotation/IntDef.html 공식 doc&quot ";

해설 (0)

39 에 유용한 유틸리티인 here& 클래스 I 작성했습니까 엔드입니다. # 39 에 대한 일반화 i-프로파일이나 it& 매우 광범위한 홍보하십시오.

import android.content.Context;
import android.content.SharedPreferences;

public class PreferencesUtils
{
    enum StorageMode {
        /** Store enum by ordinal. */
        ORDINAL,

        /** Store enum by name. */
        NAME
    }

    private static final String PREFERENCES_NAME = "your_prefs_name";

    /**
     * Put an enum in SharedPreferences with the given key.
     * @param context The context
     * @param key The preference key
     * @param enumm The enum to store
     * @param mode The mode to store the enum - by name or ordinal
     */
    public static void putEnum(final Context context, final String key, final Enum enumm, final StorageMode mode)
    {
        final SharedPreferences sp = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
        final SharedPreferences.Editor editor = sp.edit();
        switch (mode)
        {
            default:
            case ORDINAL:
                editor.putInt(key, enumm.ordinal());
                break;
            case NAME:
                editor.putString(key, enumm.name());
                break;
        }
        editor.apply();
    }

    /**
     * Get the enum stored in SharedPreferences with the given key.
     * @param context The context
     * @param key The preference key
     * @param enumType The type of Enum stored
     * @param defaultEnumm Enum returned if a preference stored with key does not exist. Can be null.
     * @param mode The mode by which the enum was originally stored
     * @param  The type of Enum stored
     * @return The Enum stored as a preference with the given key
     */
    public static  Enum getEnum(final Context context, final String key, final Class enumType,
                                                   final Enum defaultEnumm, final StorageMode mode)
    {
        final SharedPreferences sp = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
        final T[] values = enumType.getEnumConstants();

        switch (mode)
        {
            default:
            case ORDINAL:
                final int ord = sp.getInt(key, -1);
                return ord == -1 ? defaultEnumm : values[ord];
            case NAME:
                final String name = sp.getString(key, null);
                for (final T value : values)
                {
                    if (value.name().equals(name))
                    {
                        return value;
                    }
                }
        }
        return defaultEnumm;
    }
}
해설 (0)