0

I have a java class which generates Strings. Now I thought I don't want to return an array of string but only one string per call with a "getNextString" method. Then one can call the method in a loop like that:

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

I have seen this a few times in java I guess but now I wonder if there is a pattern or a best practice for methods like that? The method depends on start values so where should I initialise them? What happend if the initialise method is called by another peace of code before all strings are returned?

Whould be nice to see something about that! :)

4

3 回答 3

2

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

于 2013-07-01T14:13:34.327 回答
2

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

是一个单次使用的Iterator<String>迭代器,所以初始化会在你构造Iterator<String>.

Iterator<T>接口的 api 比检查 null 稍微好一些,因此您可以:

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

如果你实现Iterable<String>了,那么增强的 for-each 循环实际上会调用iterator()方法并为你构造循环,这样循环就变成了

for(final String myString : abc) {
}

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

此外,理论上,您可以让多个线程都沿着它们自己的迭代器运行,这也不会造成问题。

让你的Collection班级成为一个Iterator本身就是一个坏主意。

于 2013-07-01T14:13:45.977 回答
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
    }
}
于 2013-07-01T14:13:45.037 回答