Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅迭代特定类型的元素?_Java_Oop - Fatal编程技术网

Java 如何仅迭代特定类型的元素?

Java 如何仅迭代特定类型的元素?,java,oop,Java,Oop,我有这样一个数组列表: private List<GameObject> gameObjects = new CopyOnWriteArrayList<GameObject>(); 我可以使用类似上面的东西来迭代它吗?只是用石膏什么的?请提供帮助。您所走的道路在技术上是可行的,尽管一个好的经验法则是,如果您开始使用反射,您可能正在做一些错误的事情。在这种情况下,最好有两个集合,一个用于所有游戏类型,另一个专门用于宇宙飞船。您应该将shoot()方法放入宇宙飞船类,因为没

我有这样一个数组列表:

private List<GameObject> gameObjects = new CopyOnWriteArrayList<GameObject>();

我可以使用类似上面的东西来迭代它吗?只是用石膏什么的?请提供帮助。

您所走的道路在技术上是可行的,尽管一个好的经验法则是,如果您开始使用反射,您可能正在做一些错误的事情。在这种情况下,最好有两个集合,一个用于所有游戏类型,另一个专门用于宇宙飞船。

您应该将shoot()方法放入宇宙飞船类,因为没有asteriod或beam会使用此方法。完成此操作后,还应保留至少两个集合。其中一个应该只包含您的宇宙飞船。

在您的游戏中,是否有其他定期发生的动作


如果是这样,您可以将
shoot()
方法更改为抽象方法(可以命名为
periodiAction()
),并将其放置在
GameObject
类中。
宇宙飞船
类将通过射击来实现这种方法,另一类具有特定周期性行为,而
小行星
类则不做任何事情。

我宁愿这样做:

 Iterator<Spaceship> getSpaceships(){
     // return Iterator over Spaceship objects through use of instanceof
 }

 ...
 Iterator<Spaceship> it = getSpaceships()
 while(iter.hasNext()) it.next().shoot()
Iterator getSpaceships(){
//通过使用instanceof返回宇宙飞船对象上的迭代器
}
...
迭代器it=getSpaceships()
而(iter.hasNext())it.next().shoot()

对我来说,它看起来更清晰。

您可以在
游戏对象中创建一个接口
操作
或一个方法:

public interface Action {
   void performAction();
}

public abstract class GameObject implements Action {
   //...
   public void performAction() {
      // subclasses should override this method.
      // otherwise, it will do nothing.
   }
}
然后,实现
宇宙飞船

public class Spaceship extends GameObject {
    @Override
    public void performAction() {
        this.shoot();
    }
}
光束
小行星
,您可以保留方法
性能

然后,您可以通过以下方式进行交互:

for (GameObject ob : gameObjects) {
  ob.performAction();
}

我也是这么想的。但是,与宇宙飞船有关的每一个动作我都要做两次。所以,当我添加新的宇宙飞船时,我必须同时将其添加到游戏对象列表和宇宙飞船中?移除时,将其从游戏对象和宇宙飞船中移除。:/但你认为这是最好的方法?对。别担心,电脑很快好的,我就这样做。非常感谢尽管instanceof并不便宜,但维护2个系列是一个疯狂的想法。更好地使用InstanceOffCharlie为我提供了这个线程的参考基准测试结果:添加不必要的complexity@archer:没有。游戏开发中的一个常见做法是在游戏中的每个实体上添加更新/步骤/勾选/思考功能。以身份的末日3代码为例(第172行):“任何时候你发现自己编写的代码形式‘如果对象是T1类型的,那么做一些事情,但是如果对象是T2类型的,那么做一些其他事情,’打自己的耳光。”——斯科特·迈尔斯,有效的C++那不是我的设计人员;)我只是想提出一个可行的解决方案,但你建议使用instanceof,只隐藏在迭代器中,没有更好的方法。阅读其他答案的评论,你会做出同样的决定。instanceof实际上没有那么昂贵,这是一种获取类类型信息的
自然方法,无需维护单独的枚举或列表。我提出的方法只是将比较实例与调用
.shoot()
分开,这(IMHO)更适合于对已经分离到另一个列表/集合/迭代器中的对象
for (GameObject ob : gameObjects) {
  ob.performAction();
}