Java: 如何检索数组列表中的特定类型?
Java: how to retrieve a specific type in an arraylist?
我正在 Java 中为游戏引擎编写 Entity Component System(使用 LibGDX)。
我有一个包含各种组件的数组列表的实体。每个组件都继承自一个基础组件 class.
我想在我的实体上有一个方法,可以为我提供对特定类型组件(例如 RenderComponent、PhysicsComponent 等)的引用。我尝试了以下方法,但似乎没有用。
public class Entity
{
private ArrayList<Component> _components;
...
public void AddComponent(Component c)
{
_components.add(c);
c.Enable();
}
public Component GetComponent(String componentType)
{
Component s = null;
for (int i = 0; i < _components.size(); i++)
{
if (_components.get(i).getClass().getSimpleName() == componentType)
s = _components.get(i);
}
return s;
}
}
返回的对象为空
我应该怎么做?有没有更聪明的方法让参数指定类型(而不是简单的字符串)?
此外,如果我想要特定类型的所有组件怎么办?我该如何处理?
我阅读了一些关于反射的内容,但我从未使用过它。我对 Java 编程还是很陌生。
提前致谢。
幸运的是,这可以在不诉诸于称为反射的可怕事物的情况下完成。您可以简单地使用 instanceof
运算符。例如:
for (Component c : components)
if (c instanceof PhysicsComponent)
return c;
将==替换为.equals
if (_components.get(i).getClass().getSimpleName().equalsIgnoreCase(componentType))
注意:为什么不使用 Map 而不是 List?它会更快。
编辑:很简单。下面是 Map 的实现方式。
private Map<String, Component> _components = new HashMap<String, Component>();
public void addComponent(Component c) {
_components.put(c.getClass().getSimpleName(), c);
c.Enable();
}
public Component getComponent(String componentType) {
return _components.get(componentType);
}
能否在每个组件 class 中添加一个 public 最终静态字符串或枚举字段来指示类型,然后将其用于类型检查而不是反射?然后你可以把所有这些类型放在一个枚举中。反射太慢而且代价高昂。
您可以传入 class 类型。
public Component GetComponent(Class componentType){
Component s = null;
for (int i = 0; i < _components.size(); i++)
{
if (_components.get(i).getClass() == componentType)
s = _components.get(i);
}
return s;
}
试试这个
public class Entity
{
private ArrayList<Component> _components;
...
public void addComponent(Component c)
{
_components.add(c);
c.Enable();
}
public Component getComponent(Class componentClass)
{
for (Component c : _components)
{
if (c.getClass() == componentClass)
return c;
}
return null;
}
}
你这样调用方法:
getComponent(PhysicsComponent.class)
并获取列表:
public List<Component> getAllComponents(Class componentClass)
{
List<Component> components = new ArrayList<Component>();
for (Component c : _components)
{
if (c.getClass() == componentClass)
components.add(c);
}
return components;
}
我正在 Java 中为游戏引擎编写 Entity Component System(使用 LibGDX)。
我有一个包含各种组件的数组列表的实体。每个组件都继承自一个基础组件 class.
我想在我的实体上有一个方法,可以为我提供对特定类型组件(例如 RenderComponent、PhysicsComponent 等)的引用。我尝试了以下方法,但似乎没有用。
public class Entity
{
private ArrayList<Component> _components;
...
public void AddComponent(Component c)
{
_components.add(c);
c.Enable();
}
public Component GetComponent(String componentType)
{
Component s = null;
for (int i = 0; i < _components.size(); i++)
{
if (_components.get(i).getClass().getSimpleName() == componentType)
s = _components.get(i);
}
return s;
}
}
返回的对象为空
我应该怎么做?有没有更聪明的方法让参数指定类型(而不是简单的字符串)?
此外,如果我想要特定类型的所有组件怎么办?我该如何处理?
我阅读了一些关于反射的内容,但我从未使用过它。我对 Java 编程还是很陌生。
提前致谢。
幸运的是,这可以在不诉诸于称为反射的可怕事物的情况下完成。您可以简单地使用 instanceof
运算符。例如:
for (Component c : components)
if (c instanceof PhysicsComponent)
return c;
将==替换为.equals
if (_components.get(i).getClass().getSimpleName().equalsIgnoreCase(componentType))
注意:为什么不使用 Map 而不是 List?它会更快。
编辑:很简单。下面是 Map 的实现方式。
private Map<String, Component> _components = new HashMap<String, Component>();
public void addComponent(Component c) {
_components.put(c.getClass().getSimpleName(), c);
c.Enable();
}
public Component getComponent(String componentType) {
return _components.get(componentType);
}
能否在每个组件 class 中添加一个 public 最终静态字符串或枚举字段来指示类型,然后将其用于类型检查而不是反射?然后你可以把所有这些类型放在一个枚举中。反射太慢而且代价高昂。
您可以传入 class 类型。
public Component GetComponent(Class componentType){
Component s = null;
for (int i = 0; i < _components.size(); i++)
{
if (_components.get(i).getClass() == componentType)
s = _components.get(i);
}
return s;
}
试试这个
public class Entity
{
private ArrayList<Component> _components;
...
public void addComponent(Component c)
{
_components.add(c);
c.Enable();
}
public Component getComponent(Class componentClass)
{
for (Component c : _components)
{
if (c.getClass() == componentClass)
return c;
}
return null;
}
}
你这样调用方法:
getComponent(PhysicsComponent.class)
并获取列表:
public List<Component> getAllComponents(Class componentClass)
{
List<Component> components = new ArrayList<Component>();
for (Component c : _components)
{
if (c.getClass() == componentClass)
components.add(c);
}
return components;
}