代码规范-对象的创建-构建器的缺点以及改进

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

使用构建器创建对象,可以保持传值的安全,但是用构建器构建的对象,属性设置为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);
    }
}

以后,至少在更好的结构出现之前,以上代码结构就是我目前实现实体的规范了。

猜你喜欢

转载自blog.csdn.net/a13662080711/article/details/108172096