Java 返回下一个值的模式?

Java 返回下一个值的模式?,java,design-patterns,iteration,Java,Design Patterns,Iteration,我有一个生成字符串的java类。现在我想我不想返回一个字符串数组,而是用“getNextString”方法每次调用只返回一个字符串。 然后可以在如下循环中调用该方法: while(abc.getNextString() != null) { ... } 我想我已经在java中见过几次了,但现在我想知道是否有这样的方法的模式或最佳实践? 该方法取决于起始值,因此我应该在哪里初始化它们? 如果在返回所有字符串之前,initialise方法被另一段代码调用,会发生什么 看到这件事一定很高兴!

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

while(abc.getNextString() != null) {
    ...
}
我想我已经在java中见过几次了,但现在我想知道是否有这样的方法的模式或最佳实践? 该方法取决于起始值,因此我应该在哪里初始化它们? 如果在返回所有字符串之前,initialise方法被另一段代码调用,会发生什么


看到这件事一定很高兴!:)

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

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

要做到这一点,需要两件事:

  • 从字符串生成字符串的字符串生成器
  • 您自己的数据结构将记住最后生成的字符串
比如:

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
    }
}

您需要两件事来实现这一目标:

  • 从字符串生成字符串的字符串生成器
  • 您自己的数据结构将记住最后生成的字符串
比如:

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
    }
}

该模式称为
迭代器
模式。您可能希望类实现Iterable
;然后需要实现一个返回
迭代器的方法

迭代器
是一个单用迭代器,因此在构造
迭代器
时会进行初始化

与检查null相比,
迭代器
接口的api稍好一些,因此您可以:

while(myIterator.hasNext()) {
    final String myString = myIterator.next();
}
如果您实现了
Iterable
,那么增强的for each循环实际上会调用
iterator()
方法,并为您构造循环,这样循环就变成

for(final String myString : abc) {
}
其思想是,每个迭代器都是独立的,因此,init方法被无序调用不会有问题

此外,从理论上讲,可以让多个线程沿着自己的迭代器运行,这也不会带来问题


让您的
集合
类本身成为
迭代器是个坏主意。

该模式称为
迭代器
模式。您可能希望类实现Iterable
;然后需要实现一个返回
迭代器的方法

迭代器
是一个单用迭代器,因此在构造
迭代器
时会进行初始化

与检查null相比,
迭代器
接口的api稍好一些,因此您可以:

while(myIterator.hasNext()) {
    final String myString = myIterator.next();
}
如果您实现了
Iterable
,那么增强的for each循环实际上会调用
iterator()
方法,并为您构造循环,这样循环就变成

for(final String myString : abc) {
}
其思想是,每个迭代器都是独立的,因此,init方法被无序调用不会有问题

此外,从理论上讲,可以让多个线程沿着自己的迭代器运行,这也不会带来问题

让您的
集合
类本身成为
迭代器是个坏主意