首页 / JAVA / 带继承的Java Builder模式
带继承的Java Builder模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了带继承的Java Builder模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2430字,纯文字阅读大概需要4分钟。
内容图文
![带继承的Java Builder模式](/upload/InfoBanner/zyjiaocheng/728/505d7b8c46b24dc3a8f538adeb8b05da.jpg)
我想实现一个带有静态内部类的构建器模式,比如说类A带有字段(a1,a2,a3),B带有字段(b1,b2),C带有字段(c1),而所有共享字段(s1,s2) )来自超级SuperClass:
public class A extends SuperClass {
private final String a1;
...
private A(ABuilder builder) {
super(builder);
this.a1 = builder.a1;
...
}
public static class ABuilder extends SuperClassBuilder implements ABuilderInterface {
private String a1;
...
@Override
public ABuilder withA1(String a1) {
this.a1 = a1;
return this;
}
...
@Override
public SuperClass build() {
return new A(this);
}
}
}
因此,对于B和C,构建器只是不同,它们有自己的字段并实现它们自己的接口(BBuilderInterface和CBuilderInterface),而这些接口只定义要实现的方法:
public interface ABuilderInterface extends SuperClassBuilderInterface {
ABuilderInterface withA1(String a1);
...
}
...<interfaces for B and C>
public interface SuperClassBuilderInterface {
SuperClassBuilderInterface withS1(String s1);
...
SuperClass build();
}
// Usage of the builders:
public SuperClass foo() {
return new A.ABuilder()
.withA1(...) // returns ABuilderInterface
...
.withS1(...) // returns SuperClassBuilderInterface
...
.build();
}
public abstract class SuperClass {
private final String s1;
...
protected SuperClass(SuperClassBuilder builder) {
this.s1 = builder.s1;
...
}
protected static abstract class SuperClassBuilder implements SuperClassBuilderInterface {
private String s1;
...
@Override
public SuperClassBuilder withS1(String s1) {
this.s1 = s1;
return this;
}
...
@Override
public abstract SuperClass build();
}
}
现在你可以发现当我使用构建器时我必须注意首先调用与子类相关的with …方法,然后将它们链接到超类,这不是一个大问题,但仍然不确定是否良好的做法.
另一方面,我可以将子类的with …方法一起添加到超类接口,然后限制消失,但后来我有一个混合了…的不同子类的方法.
你更喜欢/建议哪一个?
解决方法:
修改超类的构建器以使用F-bound(又名Curiously Recurring模板模式).
public interface SuperClassBuilderInterface<SELF extends SuperClassBuilderInterface<SELF>> {
SELF withS1(String s1);
// etc.
Superclass build();
}
然后你有:
class SuperClassBuilder<SELF extends SuperClassBuilder<SELF>> implements SuperClassBuilderInterface<SELF>
interface ABuilderInterface<SELF extends ABuilderInterface<SELF>> extends SuperClassBuilderInterface<SELF>
class ABuilder extends SuperClassBuilder<ABuilder> implements ABuilderInterface<ABuilder>
注意,SuperClassBuilder的实现必须包含表单return(SELF)this;的未经检查的强制转换.类型系统在理论上足够强大,不需要这个,但结果编码可能非常难看(见this),它可能不值得.
编辑:这是@shmosel的意思
内容总结
以上是互联网集市为您收集整理的带继承的Java Builder模式全部内容,希望文章能够帮你解决带继承的Java Builder模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。