【问题标题】:How to store Java constants for use in building key value combinations如何存储 Java 常量以用于构建键值组合
【发布时间】:2011-07-15 19:40:45
【问题描述】:

假设我想将这些键的潜在键和潜在值存储为常量。我怎样才能做到这一点?还是我应该完全避免它?

这是我自己想到的方法,但正如你所看到的,它有明显的失败。

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 */ }

【问题讨论】:

  • 你想用这个解决什么问题?
  • @Paul - 我得到一个动态生成的哈希图。我正在尝试查看地图中是否存在某些键。如果有,它们是否等于特定值?我想将它们存储在某个地方,因为我确实与许多地方的信息进行了比较。
  • 我只会将 HashMap 保留在实用程序类中。使其成为单例并使用静态访问器来处理私有静态 HashMap。为方便起见,您可以使用 public static boolean hasValue(String key, String value) 之类的方法(其中键和值的类型与地图中的内容匹配)来检查键是否具有特定值。

标签: java constants hashmap


【解决方案1】:

如果它们都是常量,你可以使用枚举:

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】:

    请避免使用这样的常量。对于常量,使用 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

    【讨论】:

      【解决方案3】:

      如果可能,您是否可以不只是在 XML 文件中指定这些键并使用 Java XML 绑定 (JAXB) 来加载它们。

      • 您可以避免在密钥发生变化时重新构建和部署代码。

      【讨论】:

        【解决方案4】:

        将常量放在Map 中,然后使用Collections.unmodifiableMap() 方法使其不可修改。

        【讨论】:

        • 这不是您实际处理常量的方式,是吗?
        • 不,但是这又不是你常用的常量功能。投票最多的答案也使用unmodifiableMap()。我不明白你的反对意见。
        • bkent 的答案被封装在一个枚举中,这样既可以保证类型安全,又可以满足发帖者的需求。
        猜你喜欢
        • 2013-05-05
        • 1970-01-01
        • 2015-07-09
        • 1970-01-01
        • 2021-10-26
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        相关资源
        最近更新 更多