我想为所有实现类提供一个默认方法,该方法使用默认值初始化父字段。所以我不必在每个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,功能接口或类似的东西?
答案 0 :(得分:2)
以下是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);
}
}
答案 1 :(得分:1)
这就是构造者的目的。
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";
}
}