返回下一个值的模式?

时间:2013-07-01 14:06:11

标签: java design-patterns iteration

我有一个生成字符串的java类。现在我以为我不想返回一个字符串数组,但每次调用只有一个字符串,带有“getNextString”方法。 然后可以在循环中调用该方法:

while(abc.getNextString() != null) {
    ...
}

我在java中已经看过几次了,但我现在想知道这样的方法是否有模式或最佳实践? 该方法取决于起始值,所以我应该在哪里初始化它们? 如果在返回所有字符串之前,另一个代码的调用会调用initialise方法会发生什么?

很高兴看到这个! :)

3 个答案:

答案 0 :(得分:2)

这将是您应该实现的迭代器。迭代器保持其当前位置。应该没有initialize()方法。相反,您在Iterable中构造Iterator并确保使用可见性(私有,包私有)迭代器不能被篡改。但是,如果可以同时编辑Iterable,你可以使用Iterable维护一个版本计数器,让Iterator检查计数器是否发生了变化,如果是这样就抛出一个ConcurrentModificationException。

答案 1 :(得分:2)

该模式称为Iterator模式。你可能希望你的班级implements Iterable<String>;然后需要实现一个返回Iterator<String>

的方法

Iterator<String>是一个单独使用的迭代器,因此在构造Iterator<String>时会发生初始化。

Iterator<T>接口有一个比检查null更好的api,所以你这样做:

while(myIterator.hasNext()) {
    final String myString = myIterator.next();
}

如果你实现Iterable<String>,那么增强的for-each循环将实际调用iterator()方法并为你构造循环,以便循环变为

for(final String myString : abc) {
}

这个想法是每个迭代器都是独立的,因此你不会遇到乱序调用init方法的问题。

另外,从理论上讲,你可以使用多个线程沿着自己的迭代器行走,这也不会造成问题。

Collection班级成为Iterator本身是一个坏主意。

答案 2 :(得分:0)

你需要两件事才能完成这项工作:

  • 从字符串
  • 生成字符串的字符串生成器
  • 您自己的数据结构,它将记住最后生成的字符串。

类似的东西:

public class StringGenerator {

    private String lastString;

    public StringGenerator() {
        this(null);
    }

    public StringGenerator(String startString) {
         lastString= startString;
    }

    public String getNextString() {
        if (lastString == null) {
            lastString= UUID.randomUUID().toString();
        }
        lastString= generateString(lastString);
        return lastString;
    }

    //private string generator (find any on the internet)
    private String generateString(String str) {
        .... maybe use md5 hash
    }
}