2013-07-01 49 views
0

我有一個生成字符串的java類。現在我想我不想返回一個字符串數組,但每次調用時只有一個字符串帶有「getNextString」方法。 那麼可以調用該方法在這樣一個循環:返回下一個值的模式?

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

我已經看到這個在java中我猜了幾次,但現在我不知道是否有規律可循的或類似的方法,最好的做法? 該方法取決於開始值,所以我應該在哪裏初始化它們? 如果在返回所有字符串之前初始化方法被另一個代碼調用所調用,會發生什麼情況?

應該很高興看到這件事! :)

回答

2

的模式被稱爲Iterator模式。你可能希望你的班級implements Iterable<String>;那麼將需要實現返回Iterator<String>的方法。

Iterator<String>是一次性迭代器,所以初始化將在您構建Iterator<String>時發生。

Iterator<T>接口具有比檢查空稍微更好的API,讓你做:

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

而且如果實現Iterable<String>然後增強的for-each循環實際上將調用iterator()方法,構建循環你,使迴路變得

for(final String myString : abc) { 
} 

的想法是,每個迭代器是獨立的,因此,你不能有init方法問題,被稱爲壞了。

另外,從理論上講,你可以有多個線程都沿着自己的迭代器走,這也不會造成問題。

有你的Collection類是Iterator本身是一個壞主意。

2

這將是你應該實現的迭代器。迭代器保持其當前位置。應該沒有initialize()方法。相反,您在Iterable中構造Iterator,並確保使用迭代器不能被篡改的可見性(private,package private)。但是,如果可以同時編輯Iterable,則可以使用Iterable維護版本計數器,讓Iterator檢查計數器是否更改,如果是,則拋出ConcurrentModificationException。

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