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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这是谁的博客?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值