【问题标题】:Abstracting an ArrayList<E> iteration to build a reusable method抽象 ArrayList<E> 迭代以构建可重用方法
【发布时间】:2014-03-14 01:13:15
【问题描述】:

目前我有这段代码工作但重复:

Iterator<Moo> it6 = moos.iterator();
   while (it6.hasNext()) {
      Moo m = it6.next();
      m.update();
      if (!m.isActive())
         it6.remove();
}

Iterator<Pip> it7 = pips.iterator();
   while (it7.hasNext()) {
      Pip s = it7.next();
      s.update();
      if (!s.isActive())
         it7.remove();
}

... and other ...

在该类上定义点数和moos:

public class GameEngine {
   private ArrayList<Moo> moos;
   private ArrayList<Pip> pips;
   ...

还有 Moo/Pip 类:

public class Moo extends GameSprite {
   ...

public class Pip extends GameSprite {
   ...

我可以使用一些设计模式(或一些不同的实现)来减少编写代码并使其更优雅吗?

【问题讨论】:

  • isActive()update() 是否在 GameSprite 中声明?
  • 您需要添加更多信息。仅仅添加类的声明并没有多大帮助。 isActive() 定义在哪里。你在哪里有这些代码?除了从ArrayList 中删除元素之外,这些代码到底在做什么?
  • @MarkPeters 所说的。如果是,并且如果你准备好使用外部库,Guava 有Iterables.removeIf()
  • isActive() 在 GameSprite 上声明,update 是在 GameSprite 上声明但在 Pip 和 Moo 上实现的抽象方法

标签: java design-patterns arraylist iterator abstract


【解决方案1】:

如果在GameSprite中声明isActive()update(),可以使用泛型方法:

private static void update(List<? extends GameSprite> sprites) {

    Iterator<? extends GameSprite> it = sprites.iterator();
    while (it.hasNext()) {
      GameSprite s = it.next();
      s.update();
      if (!s.isActive())
         it.remove();
    }
}

然后只需调用它

update(pips);
update(moos);

【讨论】:

  • 似乎每个人都同时发布了相同的答案。 +1 因为你是第一个。
  • @Axel 如果是这种情况,那么为了谦虚起见,至少你可以投票给其他人的答案!
【解决方案2】:

确保 GameSprite 类具有 isActive() 和 update() 作为方法(如果实现不同则抽象)

   public void removeInactive(ArrayList<? extends GameSprite> itList){
        Iterator<GameSprite> it = itList.iterator();
        while (it.hasNext()) {
            GameSprite s = it.next();
            s.update();
            if (!s.isActive())
                it.remove();
        }
    }

【讨论】:

    【解决方案3】:

    您需要一个通用接口来提供所有类都实现的update()isActive() methods. Either pull them up to theGameSpriteclass, or add another interface (e.g.,Updatable`)。

    完成此操作后,您可以将此公共代码提取到方法中:

    public updateAll (Iterable<? extends GameSprite> sprites) {
       Iterator<? extends GameSprite> it = sprites.iterator();
       while (it.hasNext()) {
          GameSprite s = it.next();
          s.update();
          if (!s.isActive())
             it.remove();
    }
    

    【讨论】:

      【解决方案4】:

      创建接口Updatable:

      public interface Updatable {
          void update();
          boolean isActive();
      }
      

      并让MooPip 实现该接口。那么你的通用方法如下所示:

      public void update(List<? extends Updatable> items) {
          Iterator<? extends Updatable> it6 = items.iterator();
          while (it6.hasNext()) {
              Updatable m = it6.next();
              m.update();
              if (!m.isActive())
                  it6.remove();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-07-12
        • 2015-09-23
        • 1970-01-01
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 2018-01-29
        相关资源
        最近更新 更多