public abstract class Human {
protected String name;
protected int age;
}
public class Woman extends Human {
protected String loveMovie;
}
public class Man extends Human {
protected String soccerTeam;
}
Man 和 Woman 创建构建器。我们可以为每个人实现一个构建器,重复设置 name 和 age 属性的方法。然而,由于 Man 和 Woman 继承自 Human ,因此我们可以拥有一个抽象的 HumanBuilder ,并使我们的 WomanBuilder 和 ManBuilder 从中继承。这就是F-bounded类型派上用场的地方。
Human 类及其 HumanBuilder 如下:
public abstract class Human {
protected String name;
protected int age;
public static abstract class HumanBuilder<H extends Human,
T extends HumanBuilder<H, T>> {
protected String name;
protected int age;
@SuppressWarnings("unchecked")
public T name(String name) {
this.name = name;
return (T) this;
}
@SuppressWarnings("unchecked")
public T age(int age) {
this.age = age;
return (T) this;
}
protected void fill(H human) {
human.name = this.name;
human.age = this.age;
}
protected abstract H create();
public final H build() {
H human = this.create();
this.fill(human);
return human;
}
}
}
这将是Woman
类,以及它的WomanBuilder
:
public class Woman extends Human {
protected String loveMovie;
public static class WomanBuilder extends HumanBuilder<Woman, WomanBuilder> {
protected String loveMovie;
public WomanBuilder loveMovie(String loveMovie) {
this.loveMovie = loveMovie;
return this;
}
@Override
protected void fill(Woman woman) {
super.fill(woman);
woman.loveMovie = this.loveMovie;
}
@Override
protected Woman create() {
return new Woman();
}
}
}
最后,这是Man
类,以及它的ManBuilder
:
public class Man extends Human {
protected String soccerTeam;
public static class ManBuilder extends HumanBuilder<Man, ManBuilder> {
protected String soccerTeam;
public ManBuilder soccerTeam(String soccerTeam) {
this.soccerTeam = soccerTeam;
return this;
}
@Override
protected void fill(Man man) {
super.fill(man);
man.soccerTeam = this.soccerTeam;
}
@Override
protected Man create() {
return new Man();
}
}
}
这种方法可以节省很多代码行数,特别是在实际应用中。
使用构建器时不需要进行任何转换,符合预期:
Man man = new Man.ManBuilder()
.name("Joe")
.age(29)
.soccerTeam("Los Angeles Galaxy")
.build();
Woman woman = new Woman.WomanBuilder()
.name("Jane")
.age(25)
.loveMovie("Meet Joe Black")
.build();
Man
е’ҢдёҖдёӘWoman
е®һдҫӢ :-D - Marco13BabyBuilder
:P - fpsabstract class Base {
protected abstract Base getNewInstance();
}
class Variant<T extends Variant<T>> extends Base<T> {
protected Base<T> getNewInstance() {
return new Variant();
}
}
就实用性而言,我个人并不认为有什么用处。它过于复杂,可能需要重构为更易读的内容。
getNewInstance
将T
声明为其返回类型,你的第二个示例将是相关的。但是现在,由于您将Base<T>
声明为返回类型,因此从T extends Variant<T>
中获得不到任何好处。 - Mark Peterspublic static <T extends Comparable<T>> T min(Iterable<T> args) {
T m = null;
for (T arg : args)
m = (m == null || arg.compareTo(m) < 0) ? arg : m;
return m;
}
这不完全是你所谈论的扩展形式,但是它与之密切相关。通用扩展本身在树形结构中可能非常有用,例如。