如何存储Java类型,只允许一些特定的?

前端之家收集整理的这篇文章主要介绍了如何存储Java类型,只允许一些特定的?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我想要有一个类用于记录的描述符,其中每个记录都有一组属性.

每个属性都有一个唯一的名称,应该有一个特定的类型,对应一个特定的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包含在编译器中.

猜你在找的Java相关文章