簡體   English   中英

java.util.regex.Pattern和java.util.regex.Matcher的設計有什么好處?

[英]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以獲取更多詳細信息)

  1. 檢查給定字符串是否與給定的正則表達式匹配。
  2. 將給定字符串與給定模式匹配,並返回各種匹配結果。

對於第一種情況,可以使用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;
}

可以看出, MatcherPattern作為構造函數參數 - 這樣它就可以在各個點調用它來獲取和維護匹配結果

PS
像任何API一樣, PatternMatcher也可能有不同的實現方式 - 並非所有Java API在設計上都是一致的 - 我想開發人員總是會有一些特性留下開發的API。 以上答案是我對這些開發人員采用的方法的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM