我想为所有实现类提供一个默认方法,该方法使用默认值初始化父字段。所以我不必在每个 Impl 类中重新定义这些初始化:
public abstract class Parent {
private String name;
public static Parent defaultParent() {
Parent parent = new Parent();
//fill default field values
parent.name = "default name";
return parent;
}
}
public class Child extends Parent {
}
现在我可以打电话给Child.defaultParent()
.但这会给我一个类型 Parent
的对象。是否有可能以这种方式使对象成为隐式Child
对象?以便 defaultParent
方法始终返回实现类的类型?
也许使用 java 8、函数接口或类似内容?
以下是使用 Java 8 的一种方法:
public abstract class Parent {
private String name;
public static <T extends Parent> T defaultParent(Supplier<T> constructor) {
T parent = constructor.get();
//fill default field values
parent.name = "default name";
return parent;
}
}
public class Child extends Parent {
}
您可以像这样调用静态方法:
Child c = Parent.defaultParent(Child::new);
或者,您可以只使用构造函数重载而不是静态工厂方法:
public abstract class Parent {
private String name;
public Parent(boolean useDefaults) {
if (useDefaults) {
//fill default field values
this.name = "default name";
}
}
}
public class Child extends Parent {
public Child(boolean useDefaults) {
super(useDefaults);
}
public Child() {
super(false);
}
}
这就是构造函数的目的。
abstract class Parent {
private String name;
protected Parent(String name) {
this.name = name;
}
protected Parent() {
this("default name");
}
}
class DefaultChild extends Parent {
public DefaultChild() { super(); }
}
class CustomChild extends Parent {
public CustomChild(String value) { super(value); }
}
其他一切都只是一个花哨的 init 方法,不如构造函数,因为例如,您可以不再为final
字段分配值。
abstract class Parent {
private String name;
protected void init() {
this.name= "default name";
}
// or
protected static void init(Parent parent) {
parent.name = "default name";
}
}