我有一个生成字符串的java类。现在我以为我不想返回一个字符串数组,但每次调用只有一个字符串,带有“getNextString”方法。 然后可以在循环中调用该方法:
while(abc.getNextString() != null) {
...
}
我在java中已经看过几次了,但我现在想知道这样的方法是否有模式或最佳实践? 该方法取决于起始值,所以我应该在哪里初始化它们? 如果在返回所有字符串之前,另一个代码的调用会调用initialise方法会发生什么?
很高兴看到这个! :)
答案 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
}
}