Java优化考虑构建器创建对象

最近在做项目的时候,需要新建一个对象叫CartMessage。CartMessage只作为方法参数,如果要构建一个CartMessage,没有重构之前的做法是类似这样的:

CartMessage msg = new CartMessage();
msg.setA();
msg.setB();
msg.setC();
...
helpCartService.sendMsgToWebSocket(msg);

发现用set的方法比较累赘,占用多行,写起来不简洁。忽略想去Java Effecttive书中关于构建对象的建议。想起了构建器方式。首先在CartMessage中加入Builder构建器:

    public static class Builder{
        private CartMessage cartMessage;
        public Builder(){
            cartMessage = new CartMessage();
        }
        public Builder entityId(String entityId){
            cartMessage.setEntityId(entityId);
            return this;
        }
        public Builder seatCode(String seatCode){
            cartMessage.setSeatCode(seatCode);
            return this;
        }
        public Builder customerId(String customerId){
            cartMessage.setCustomerRegisterId(customerId);
            return this;
        }
        public Builder orderId(String orderId){
            cartMessage.setOrderId(orderId);
            return this;
        }
        public CartMessage build(){
            return cartMessage;
        }
    }

重构之后,只要一行代码就行了,而且清晰明了:

helpCartService.sendMsgToWebSocket(new CartMessage.Builder().
                    entityId(entityId).seatCode(seatCode).customerId(customerRegisterId).orderId(orderId).build());

构建器有很多变形,灵活多变,例如zookeeper客户端Curator中client的创建也是用构建器:

    static CuratorFramework client = CuratorFrameworkFactory.builder()
            .connectString("localhost:2181")
            .sessionTimeoutMs(5000)
            .retryPolicy(retryPolicy)
            .build();

builder()是个静态方法,返回一个构建器:

   public static Builder builder()
    {
        return new Builder();
    }

构建器如下:

 public static class Builder
    {
        private EnsembleProvider ensembleProvider;
        private int sessionTimeoutMs = DEFAULT_SESSION_TIMEOUT_MS;
        private int connectionTimeoutMs = DEFAULT_CONNECTION_TIMEOUT_MS;
        private int maxCloseWaitMs = DEFAULT_CLOSE_WAIT_MS;
        private RetryPolicy retryPolicy;
        private ThreadFactory threadFactory = null;
        private String namespace;
        private List<AuthInfo> authInfos = null;
        private byte[] defaultData = LOCAL_ADDRESS;
        private CompressionProvider compressionProvider = DEFAULT_COMPRESSION_PROVIDER;
        private ZookeeperFactory zookeeperFactory = DEFAULT_ZOOKEEPER_FACTORY;
        private ACLProvider aclProvider = DEFAULT_ACL_PROVIDER;
        private boolean canBeReadOnly = false;
        /**
         * Apply the current values and build a new CuratorFramework
         *
         * @return new CuratorFramework
         */
        public CuratorFramework build()
        {
            return new CuratorFrameworkImpl(this);
        }
        /**
         * Apply the current values and build a new temporary CuratorFramework. Temporary
         * CuratorFramework instances are meant for single requests to ZooKeeper ensembles
         * over a failure prone network such as a WAN. The APIs available from {@link CuratorTempFramework}
         * are limited. Further, the connection will be closed after 3 minutes of inactivity.
         *
         * @return temp instance
         */
        public CuratorTempFramework buildTemp()
        {
            return buildTemp(DEFAULT_INACTIVE_THRESHOLD_MS, TimeUnit.MILLISECONDS);
        }
...

可以看出builder有很多构建方式,如buildTemp()构建临时对象,build()创建了一个实现类等。有兴趣的话自己可以看看源码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值