Как сохранить константы Java для использования при построении комбинаций значений ключей - PullRequest
2 голосов
/ 15 июля 2011

Допустим, я хочу сохранить потенциальные ключи и потенциальные значения для этих ключей как константы.Как мне этого добиться?Или мне вообще следует этого избегать?

Это подход, который я подумал о себе, но, как вы увидите, он имеет очевидный недостаток.

public static class Foo { 

    public static final String KEY = "foo" ; 

    public static class Values { 

        public static final String BAR = "bar" ; 
        public static final String HEY = "hey" ; 

    }

}

public static class Another { 

    public static final String KEY = "another" ; 

    public static class Values { 

        public static final String ONE = "1" ; 
        public static final String TWO = "two" ;
        public static final String THREE = "THREE" ;

    }

}

, который позволяет мне получить доступ к этим ключам примерно так

miscellaneousMethod( Foo.KEY, Foo.Values.BAR )
miscellaneousMethod( Another.KEY, Another.Values.TWO )

Однако я не хочу писать отдельный статический внутренний класс для каждой пары ключ / возможные значения.

Есть ли лучший способ хранить пары ключ-значение в качестве констант?

Я хочу сохранить их как константы для последующего сравнения с созданными хэш-картами.Так что я могу спросить что-то вроде этого:

if( map.get( Foo.KEY ).equals( Foo.Values.HEY ) ) { /* do stuff */ }

Ответы [ 4 ]

5 голосов
/ 15 июля 2011

Если они все константы, вы можете использовать Enum:

public enum ValueEnum {

    FOO("foo", "bar", "hey"),
    ANOTHER("another", "1", "two", "THREE"),

    ;

    private final String key;

    private final Set<String> values;

    private ValueEnum(String key, String... values) {
        this.key = key;
        this.values = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(values)));
    }

    public final boolean isInMap(Map<String,String> map) {
        if(map.containsKey(key)) {
            return values.contains(map.get(key));
        }
        else {
            return false;
        }
    }
}

затем

if( ValueEnum.FOO.isInMap(map) ) { /* do stuff */ }
2 голосов
/ 15 июля 2011

Пожалуйста, избегайте таких констант.Для констант используйте тип перечисления Java.Он компилируется под капотом как классы, так что вы получаете безопасность типов, и вы также можете использовать их в выражениях switch.Приятно иметь возможность добавлять методы к ним тоже.

Вот хороший пример: http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

Более длинное обсуждение (со многими примерами) здесь: http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html

0 голосов
/ 16 июля 2011

Если возможно, вы не можете просто указать эти ключи в XML-файле и использовать привязку Java XML (JAXB) для их загрузки.

  • вам не придется перестраивать и развертывать свой код, когда иесли ключи меняются.
0 голосов
/ 15 июля 2011

Поместите константы в Map, а затем сделайте его неизменяемым, используя метод Collections.unmodifiableMap().

...