在同一个类中实现多个迭代器

一般

我回头看了一些写在不同迭代器需要的地方的代码,我注意到我像平常一样写了第一个迭代器:

private class Traverse implements Iterator {
    int pos = 0;
    boolean hasNextCalled = false;
    @Override
    public boolean hasNext() {
        hasNextCalled = true;
        if(pos<size()) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Card next() {
        return cards.get(pos++);
    }

    @Override
    public void remove() {
        if (!hasNextCalled) {
            throw new IllegalStateException("hasNext() must be called before remove()");
        }
        if(pos<1) {
            throw new IllegalStateException();
        }
       cards.remove(--pos);
       hasNextCalled = false;
    }

}

然后通过创建一个新的Traverse对象但覆盖所有方法来实现第二个迭代器:

public Iterator OddEvenIterator() {
    Iterator it = new Traverse(){
        private int pos = 0;
        boolean hasNextCalled = false;

        @Override
        public boolean hasNext() {
            hasNextCalled = true;
            if (pos < size()) {
                return true;
            } else {
                return false;
            }
        }

        @Override
        public Card next() {
            Card nextCard = cards.get(pos);
            pos+=2;
            boolean moreCards = hasNext();
            if(moreCards==false) {
                pos=1;
            }
            return nextCard;
        }

        @Override
        public void remove() {
            if (!hasNextCalled) {
                throw new IllegalStateException("hasNext() must be called before remove()");
            }
            if (pos < 1) {
                throw new IllegalStateException();
            }
            pos-=2;
            cards.remove(pos);
            hasNextCalled = false;
        }
    };
    return it;      
}

我不记得为什么要这么做了,但是这样做感觉很糟糕。我想知道这两种方法之间是否有有效的区别?

伊沙维特

第二种方法创建了一个extends匿名类Traverse,这意味着您可以访问其成员(当然要考虑正常的可见性规则)。但是你再影子,这两个成员Traverse宣称,这意味着匿名类不会使用它们。

假设您定义了每个Iterator方法,并且返回值的类型为Iterator,则没有理由扩展类而不是Iterator直接实现,除非您需要访问该类提供的某些成员。由于您在这种情况下不这样做,因此没有理由进行扩展Traverse

此外,Traverse除了这些Iterator方法外,没有定义其他任何方法,因此在向下转换从OddEvenIterator返回的迭代器时甚至没有任何用处Traverse如果有的话,那可能就是扩展它的原因-尽管这也可能是代码的味道。

扩展的唯一其他原因Traverse是其他一些代码是否使用反射来检查的子类型Traverse(包括使用instanceof)。再次,这可能是代码的味道-但这是有可能的。

我会建议一些风格方面的事情,顺便说一句:

  • 您应该使用泛型而不是原始Iterator类型
  • 大多数Java约定的方法名称都以小写字母开头(因此,oddEvenIterator()
  • hasNext而不是在if-else,你可以return pos < size()这比较简单,并且始终是可取的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

扩展并在同一个类中实现

Android:如何在同一个文件中迭代多个JSON对象数组

在Rust中多次使用同一个迭代器

autofac 从同一个接口继承的多个类

从同一个类创建多个对象

我们可以在同一个对象中实现多个 QtRO 接口吗?

从多个继承同一个超类的类实现回调接口时发生冲突

是否可以在同一个类中使用,同一个接口的不同实现,使用 Microsoft.Extensions.DependencyInjection 中的服务

如何从同一个类的多个元素中获取随机元素

如何在同一个OOP类中修改多个对象?

在同一个类中具有多个面板的重绘方法

在c#中动态创建同一个类的多个对象实例

在实体框架中,如何处理同一个类的多个外键

在 LESS 的同一个选择器中嵌套不同的类

Codeigniter 应用:避免在同一个控制器的多个方法中重复代码

在同一个 AKS 集群中安装多个 nginx 入口控制器实例

从同一个类中的方法调用方法

无法在同一个类中调用函数

jQuery从同一个类中获取价值

Java中同一个类的继承与组合

在同一个类中调用函数指针

在同一个函数中返回多个变量

在同一个uri中更新多个结果

Yii2 - 在同一个 activeform 上使用同一个类的多个模型

如何在expressjs/nodejs中,在同一个控制器同一个路由下开发多个get路由功能?

我应该在同一个类中实现这两个接口吗?

同一个函数中一个类的多个模板

同一个函数中的同一个类不同的id,以避免额外的代码

为什么类模板中的成员函数在同一个地址创建同一个对象