继承和静态工厂方法
Inheritance and static factory methods
我已经为我的控制台输出编写了一个 java.util.logging.Formatter(名为 OneLineFormatter)。它有两个静态工厂方法,都调用私有构造函数。
现在我想编写第二个用于调试目的的程序(名为 DebugFormatter),它只覆盖 OneLineFormatter 中的 formatRecord 方法,因此也会打印痕迹,而不仅仅是本地化消息和 class。
Eclipse 警告我超级构造函数 OneLineFormatter() 未定义,我必须调用另一个构造函数。我用谷歌搜索了这个问题,发现了这个:Java error: Implicit super constructor is undefined for default constructor on Whosebug。
但我不想创建一个 public 构造函数,因为那会违反工厂原则。工厂方法和构造函数可以相同(不过 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>}
}
第二个class:
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-private
或 protected
创建构造函数。这样您就可以将对构造函数的访问减少到满足您需要的程度
OneLineFormatter(String rootName) {
this.rootName = rootName;
}
// OR
protected OneLineFormatter(String rootName) {
this.rootName = rootName;
}
我已经为我的控制台输出编写了一个 java.util.logging.Formatter(名为 OneLineFormatter)。它有两个静态工厂方法,都调用私有构造函数。
现在我想编写第二个用于调试目的的程序(名为 DebugFormatter),它只覆盖 OneLineFormatter 中的 formatRecord 方法,因此也会打印痕迹,而不仅仅是本地化消息和 class。
Eclipse 警告我超级构造函数 OneLineFormatter() 未定义,我必须调用另一个构造函数。我用谷歌搜索了这个问题,发现了这个:Java error: Implicit super constructor is undefined for default constructor on Whosebug。 但我不想创建一个 public 构造函数,因为那会违反工厂原则。工厂方法和构造函数可以相同(不过 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>}
}
第二个class:
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-private
或 protected
创建构造函数。这样您就可以将对构造函数的访问减少到满足您需要的程度
OneLineFormatter(String rootName) {
this.rootName = rootName;
}
// OR
protected OneLineFormatter(String rootName) {
this.rootName = rootName;
}