2016-03-29 79 views
0

我爲我的控制檯輸出編寫了一個java.util.logging.Formatter(名爲OneLineFormatter)。它有兩個靜態工廠方法,都調用私有構造函數。繼承和靜態工廠方法

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

Eclipse警告我超級構造函數OneLineFormatter()是未定義的,我必須調用另一個構造函數。我GOOGLE了這個問題,發現這個:StackOverflow上的Java error: Implicit super constructor is undefined for default constructor。 但我不想創建一個公共構造函數,因爲這會違反工廠原則。工廠方法和構造函數可以相同(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:糾正代碼

+2

請在問題中包含您的代碼。沒有它,通過閱讀你的描述來分析哪裏出錯是很困難的。 – SomeJavaGuy

+0

我會拼接出廠的OneLineFormater代碼。所以你可以擴展OnlineFormater而不是工廠。 –

+0

@ReneM。工廠方法可以保持不變,我只是想重寫OneLineFormatter中的formatRecord(LogRecord)方法 – kaesaecracker

回答

1

你可以只作構造函數OneLineFormatterpackage-privateprotected。通過這種方式,您可以將構造函數的訪問權限降低到適合您需求的程度

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