簡體   English   中英

繼承和靜態工廠方法

[英]Inheritance and static factory methods

我已經為控制台輸出編程了一個java.util.logging.Formatter(名為OneLineFormatter)。 它有兩個靜態工廠方法,都調用私有構造函數。

現在,我想編寫第二個用於調試目的的程序(名為DebugFormatter),它僅覆蓋OneLineFormatter中的formatRecord方法,因此也可以打印跟蹤,而不僅是本地化的消息和類。

Eclipse警告我,超級構造函數OneLineFormatter()未定義,因此我必須調用另一個構造函數。 我用問題搜索了一下,發現了這一點: Java錯誤:對於 StackOverflow上的默認構造函數未定義隱式超級構造函數 但是我不想創建一個公共構造函數,因為這將違反工廠原則。 工廠方法和構造函數可以相同(盡管DebugFormatter工廠方法應創建一個新的DebugFormatter而不是OneLineFormatter)。

如果您需要更多信息,請詢問。 謝謝您的幫助!

編碼:

public class OneLineFormatter extends Formatter {
    public static Formatter withPackageFromRoot(String rootName) {
        return new OneLineFormatter(rootName);
    }

    public static Formatter withClassOutputOnly() {
        return new OneLineFormatter("");
    }

    private String rootName;

    private OneLineFormatter(String rootName) {
        this.rootName = rootName;
    }

    @Override
    public String format(LogRecord record){<code>}

    private String formatRecord(LogRecord record{<code that I want to override>}
}

第二類:

public class DebugFormatter extends OneLineFormatter {
    public static Formatter withClassOutputOnly() {
        return new DebugFormatter("");
    }

    public static Formatter withPackageFromRoot(String rootName) {
        return new DebugFormatter(rootName);
    }

    private DebugFormatter(String rootName) {<same as OneLineFormatter(String)>}

    @Override
    private String formatRecord(LogRecord record) {<code>} 

}

編輯1:添加代碼編輯2:更正的代碼

你可以只作出構造OneLineFormatter package-privateprotected 這樣,您可以減少對構造函數的訪問,使其符合您的需求

OneLineFormatter(String rootName) {
    this.rootName = rootName;
}
// OR 
protected OneLineFormatter(String rootName) {
    this.rootName = rootName;
}

暫無
暫無

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

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