[英]What is benefit in design of java.util.regex.Pattern and java.util.regex.Matcher?
我認為似乎是java.util.regex.Pattern和java.util.regex.Matcher是聚合關系。 而java API表示在下面使用它們。
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
為什么Pattern和Matcher是通過靜態方法初始化的? 放置這種可能性有什么好處? 它是否直接影響我的源上的呼叫創建者?
為什么Pattern
是由static
工廠方法創建的?
根據Pattern
文檔 ,
(模式)是正則表達式的編譯表示。
Pattern
對象將與模式相關聯,並且此對象的用戶應該創建一次並多次使用它。 通過提供靜態工廠, Pattern
類可以在返回Pattern
對象之前自由執行內部檢查。 例如,它可以(如果它希望)緩存Pattern
實例並返回緩存實例,如果在另一個compile
調用中提供了相同的模式字符串(注意:這不是它實現的方式,但是,它有自由由於使用靜電廠)。
為什么Matcher
是通過Pattern
上的工廠方法創建的?
Matcher
可用於兩個目的
(以下是為了便於討論的簡化視角,請參閱Matcher
Java doc以獲取更多詳細信息) :
對於第一種情況,可以使用Pattern.matches(regex, string)
形式的方法調用。 在這種情況下,將編譯正則表達式並在匹配后返回布爾結果。 請注意,這是一種functional
的編程風格 - 它在這里工作正常,因為沒有要維護的匹配狀態。
對於第二種情況,必須維護匹配狀態,用戶可以在執行匹配后查詢。 因此,在這種情況下,使用Matcher
對象,其可以維持匹配結果的狀態。 因為,沒有相應的Pattern
對象, Matcher
對象不能存在,API開發人員只允許通過Pattern
的實例創建它 - 因此用戶可以調用p.matcher('aaaaab')
。 在內部, Pattern
類中的代碼如下所示:
public Matcher matcher(CharSequence input) {
if (!compiled) {
synchronized(this) {
if (!compiled)
compile();
}
}
Matcher m = new Matcher(this, input);
return m;
}
可以看出, Matcher
將Pattern
作為構造函數參數 - 這樣它就可以在各個點調用它來獲取和維護匹配結果
PS
像任何API一樣, Pattern
和Matcher
也可能有不同的實現方式 - 並非所有Java API在設計上都是一致的 - 我想開發人員總是會有一些特性留下開發的API。 以上答案是我對這些開發人員采用的方法的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.