Java 返回下一个值的模式?
我有一个生成字符串的java类。现在我想我不想返回一个字符串数组,而是用“getNextString”方法每次调用只返回一个字符串。 然后可以在如下循环中调用该方法:Java 返回下一个值的模式?,java,design-patterns,iteration,Java,Design Patterns,Iteration,我有一个生成字符串的java类。现在我想我不想返回一个字符串数组,而是用“getNextString”方法每次调用只返回一个字符串。 然后可以在如下循环中调用该方法: while(abc.getNextString() != null) { ... } 我想我已经在java中见过几次了,但现在我想知道是否有这样的方法的模式或最佳实践? 该方法取决于起始值,因此我应该在哪里初始化它们? 如果在返回所有字符串之前,initialise方法被另一段代码调用,会发生什么 看到这件事一定很高兴!
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方法被无序调用不会有问题
此外,从理论上讲,可以让多个线程沿着自己的迭代器运行,这也不会带来问题
让您的集合
类本身成为迭代器是个坏主意