Java-铸造一套的缺点?
为了好玩,我正在用Java开发一个基于基本实体组件系统的游戏引擎 我需要一种快速的方法来获取特定类型的所有Java-铸造一套的缺点?,java,casting,set,entity,entity-component-system,Java,Casting,Set,Entity,Entity Component System,为了好玩,我正在用Java开发一个基于基本实体组件系统的游戏引擎 我需要一种快速的方法来获取特定类型的所有组件。 例如: 我的IDE不喜欢(Set)active.get(compClass)(以黄色突出显示)。但是,这是基于非常基本的测试工作的,并且比单独转换集中的每个项并将它们添加到新的集中要快,但是这样做的潜在缺点是什么呢?您看到的IDE警告是未经检查的转换 这里您将getActiveComponents()的返回分配给集合: Set<Location> locations =
组件。
例如:
我的IDE不喜欢(Set)active.get(compClass)代码>(以黄色突出显示)。但是,这是基于非常基本的测试工作的,并且比单独转换集中的每个项并将它们添加到新的集中要快,但是这样做的潜在缺点是什么呢?您看到的IDE警告是未经检查的转换
这里您将getActiveComponents()
的返回分配给集合
:
Set<Location> locations = ComponentManager.getActiveComponents(Location.class);
在使用时:
return (Set<T>) active.get(compClass);
return(Set)active.get(compClass);
但这样做的潜在负面影响是什么
现在,您的代码是正确的,因为它在Map
条目中添加了Set
对象的运行时类型用作键的值。
但是如果以后代码在映射中添加了不符合此规则的内容,编译器将无法检测到键入错误。
因此您只能在运行时发现它:这是一个缺点
你的情况不好吗?视情况而定。
当您开发某种按类型/类别操作/分组对象的库时,可能会出现这种问题。您通常必须研究类型安全性和代码灵活性/可维护性之间的平衡。
在这里,您可以“丢失”类型安全性,以减少要维护的结构数量。
如果您有数量有限的组件
子类,并且它不移动,则可以将映射分解为多个集合:每个子类一个。这样,您就不再需要取消选中转换。
但是,如果组件
子类的数量很重要,并且它会移动(您可以随时添加或删除),则未检查的转换警告可能是可以接受的。在这种情况下,编写一个单元测试来确保只检索预期类型的实例是非常受欢迎的,因为这样可以保证编译器在执行未经检查的转换时无法为您执行操作 旁注activate
方法可以缩短为active.computeifassent(component.getClass(),compClass->newhashset()).add(component)代码>谢谢!我想我会保留它,但严格控制如何添加/删除内容。不客气。最好的保证是自动化单元测试:)
Set<Location> locations = ComponentManager.getActiveComponents(Location.class);
private static final Map<Class<? extends Component>, Set<Component>> active = new HashMap<>();
return (Set<T>) active.get(compClass);