您的位置:首页 > 编程语言 > Java开发

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

2016-06-06 11:29 344 查看
最近在做项目的时候,需要新建一个对象叫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()创建了一个实现类等。有兴趣的话自己可以看看源码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  重构 java 优化