继承和静态工厂方法

时间:2016-03-29 13:00:07

标签: java inheritance constructor factory-method

我为我的控制台输出编写了一个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)。

如果您需要更多信息,请询问。感谢您的帮助!

代码:

$('article.tile').addClass(function(i) {
    return 't' + (i + 1)
});

第二节课:

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

编辑1:添加了代码 编辑2:更正的代码

1 个答案:

答案 0 :(得分:1)

您可以为OneLineFormatter package-privateprotected制作构造函数。这样,您可以将对构造函数的访问权限减少到符合您需求的点

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