强类型关系的最佳模式

时间:2015-02-28 11:05:28

标签: java generics design-patterns interface composition

我正在寻找一种在编译时允许实例之间关系的方法。 以抽象的方式,这意味着接口的几个子类型与相同类型的多个属性相关,但并非所有属性都以逻辑方式兼容。我想在编译时检查它。

场景如下:

  • Animal实例在构造函数(它所在的国家/地区)中接收国家/地区实例。

解决方案:

  • 运行时检查例如XML和验证
<Animal>
  <Type>Lion</Type>
  <Countries>
      <Country>Zimbabwe</Country>
      <Country>Kenya</Country>
  </Countries>
</Animal>

<Animal>
   <Type>Gorilla</Type>
   <Countries>
      <Country>Zimbabwe</Country>
      <Country>Botswana</Country>
   </Countries>
</Animal>

但这只能在运行时失败

  • 为每个属性组合创建一个GorillaCountry,BotswanaCountry和KenyaCountry Country子接口,但如果有200个映射,这有点不可接受。

我所寻找的是某种模式,它在编译时以一种漂亮且可扩展的方式进行此类型检查:

if (animal instanceOf Lion){
   if (country instanceOf Botswana) throw new UnsupportedMapping("There are no lions in Botswana") 
}
//for Kenya
else if (animal instanceOf Gorilla){
   if (country instanceOf Kenya) throw new UnsupportedMapping("There are no gorillas in kenya") 
}

使用泛型或地图可能是一种棘手的方法......

1 个答案:

答案 0 :(得分:1)

你想要的是像java 8 pluggable type system

使用它的示例和框架是here

使用它来创建@Animal和@Country注释似乎完全可能,但不一定是明智的。然后设置一个相应的类型检查器,查询appropriate database以查看它们是否已灭绝。