世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
使用构建器创建对象,可以保持传值的安全,但是用构建器构建的对象,属性设置为final,是不能再赋值的,只能作为传值的对象,有很大的局限性,比如mysql的返回值要想用对象渲染,使用mybatis:
Article select(String id);
如果调用这个方法,就会报错,因为属性是final的,并且Article必须是有参构造。因此,为了通用,还是用自己想出来的更方便:
@Getter
class Article {
private String namer;
public Article set (String name) {
this.name = name;
return this;
}
}
当然,如果去掉final属性也是比较标准的:虽然多了一些内容,但是使用起来更灵活
@Data
class Article {
private String name;
// 提供一个无参构造
public Article () {}
// builder注入的构造
public Article (Builder builder) {
this.name = builder.name;
}
public static class Builder () {
private String name;
public Builder name (tString name) {
this.name = name;
return this;
}
public Article build () {
return new Article(this);
}
}
}
当然这还不是更好的,绕了一圈如果再加上静态工厂方法,那么就是形成一种方便又优雅的实现了,看来静态工厂方法还是比较有用的,并不能单纯否定:
class newBuilderTest {
@Data
static class Article {
private String name;
public static class Builder {
private String name;
public Builder setName(String name) {
this.name = name;
return this;
}
public Article build () {
return new Article(this);
}
}
public Article (Builder builder) {
this.name = builder.name;
}
public static Builder getBuilder() {
return new Article.Builder();
}
public Article () {}
}
public static void main(String[] args) {
Article article = Article.getBuilder().setName("hello").build();
System.out.println(article);
}
}
以后,至少在更好的结构出现之前,以上代码结构就是我目前实现实体的规范了。