如何从类型为Impl类的父类返回一个对象?

时间:2016-03-11 08:25:58

标签: java

我想为所有实现类提供一个默认方法,该方法使用默认值初始化父字段。所以我不必在每个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,功能接口或类似的东西?

2 个答案:

答案 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";
    }
}