假设我想要有一个类用于记录的描述符,其中每个记录都有一组属性.
每个属性都有一个唯一的名称,应该有一个特定的类型,对应一个特定的Java类型,如整数,字符串,短,双,…
应该限制可能的类型列表,例如我仅支持Integer和String.
private HashMap<String,Class> attributeList = new HashMap<String,Class>();
在上面的例子中,HashMap是属性列表,其中key是属性名称,值应该是属性的类型(整数或字符串).
限制Hashmap值定义的最佳方式是什么?
解决方法
您当然可以使用包装方法向元素添加地图,并检查Integer和Sring.但是,您只会遇到运行时错误.我同意你的限制类型来获得静态错误好多了.
为此,我实际上不会使用Integer.class和String.class,而是枚举:
enum Types { String,Integer }; private Map<String,Types> attributeList = new HashMap<String,Types>();
更新:
要想到它,还有另一个(但更复杂)的解决方案,如果你必须坚持Class对象:你可以使用假的枚举模式,即使用一组常量(通常是整数2 ^我被使用)像一个枚举所以你可以定义你的Class对象作为常量.那当然不能保证没有其他的类对象被放入地图.这就是为什么Joshua Bloch的第30项说“使用枚举而不是int常量”.但是,您可以使用Checker Framework通过使用假枚举检查程序为您的常量提供额外的类型系统:
@SuppressWarnings("fenum:assignment.type.incompatible") public class TypeEnum { public static final @Fenum("Types") Class INT_CONST = Integer.class; public static final @Fenum("Types") Class STR_CONST = String.class; }
然后,您可以使用类型类别限制对地图进行定义:
private HashMap<String,@Fenum("Types") Class> attributeList = new HashMap<String,@Fenum("Types") Class>();
当然,您需要将Fenum Checker包含在编译器中.