最近在做項目的時候,需要新建一個對象叫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()創建了一個實現類等。有興趣的話自己可以看看源碼。