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()創建了一個實現類等。有興趣的話自己可以看看源碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章