改造前
当前正在开发工会宣战的一个系统,需要存储宣战记录。但是记录包括很多数据,开始使用构造方法传递参数。
DeclareWarUnionInfo(CrossAllianceService crossAllianceService, long unionId, long acceptUnionId, long warTime,
long declareHumanId, String declareHumanName) {
this.crossAllianceService = crossAllianceService;
crossDeclareWarInfoDB = new CrossDeclareWarInfoDB();
crossDeclareWarInfoDB.setId(Port.applyId());
crossDeclareWarInfoDB.setUnionId(unionId);
crossDeclareWarInfoDB.setAcceptUnionId(acceptUnionId);
crossDeclareWarInfoDB.setAccept(EDeclare.NOT_ACCEPT.getIndex());
crossDeclareWarInfoDB.setWartime(warTime);
crossDeclareWarInfoDB.setDeclareHumanId(declareHumanId);
crossDeclareWarInfoDB.setDeclareHumanName(declareHumanName);
crossDeclareWarInfoDB.setDatetime(Port.getTime());
crossDeclareWarInfoDB.persist();
}
/**
* 使用数据库对象初始化
* @param crossAllianceService
* @param crossDeclareWarInfoDB
*/
DeclareWarUnionInfo(CrossAllianceService crossAllianceService, CrossDeclareWarInfoDB crossDeclareWarInfoDB) {
this.crossAllianceService = crossAllianceService;
this.crossDeclareWarInfoDB = crossDeclareWarInfoDB;
}
构造方法参数一堆,创建的时候要传入一堆参数。
DeclareWarUnionInfo createDeclareWarUnionInfo = new DeclareWarUnionInfo(this, unionId, opponentUnionId,
warTime, declareHumanId, declareHumanName);
// 方式2
DeclareWarUnionInfo declareWarUnionInfo = new DeclareWarUnionInfo(this, db);
变为Builder
写完之后,总是觉得这种方法不是很好。后来想到了EffectiveJava 中讲到的Builder,突然豁然开朗,这个时候其实运用这种方法可能获得很好的效果。于是开始改造。
public class DeclareWarUnionInfo {
...
/**
* DeclareWarUnionInfo 构造器
*/
static class Builder {
private final CrossAllianceService crossAllianceService;
private long unionId;
private long acceptUnionId;
private EDeclare eDeclare = EDeclare.NOT_ACCEPT;
private long warTime;
private long declareHumanId;
private String declareHumanName;
private long dateTime;
private CrossDeclareWarInfoDB crossDeclareWarInfoDB;
Builder(CrossAllianceService crossAllianceService, long unionId, long acceptUnionId) {
this.crossAllianceService = crossAllianceService;
this.unionId = unionId;
this.acceptUnionId = acceptUnionId;
}
Builder(CrossAllianceService crossAllianceService, CrossDeclareWarInfoDB crossDeclareWarInfoDB) {
this.crossAllianceService = crossAllianceService;
this.crossDeclareWarInfoDB = crossDeclareWarInfoDB;
}
Builder addWarTime(long val) {
warTime = val;
return this;
}
Builder addDeclareHumanId(long val) {
this.declareHumanId = val;
return this;
}
Builder addDeclareHumanName(String val) {
this.declareHumanName = val;
return this;
}
Builder addDateTime(long val) {
this.dateTime = val;
return this;
}
DeclareWarUnionInfo build() {
return new DeclareWarUnionInfo(this);
}
}
...
}
构造方法,进行private,防止直接new对象。只能通过带有Builder参数的构造方法在内部类Builder中实例化。(crossDeclareWarInfoDB是一个数据库对象,当传入此对象时是在从数据库载入对象。另外一种方式就创建对象,并且保存数据库)
/**
* 构造函数,此类仅能通过Builder创建
* @param builder 构造器
*/
private DeclareWarUnionInfo(Builder builder) {
crossAllianceService = builder.crossAllianceService;
if (builder.crossDeclareWarInfoDB == null) {
crossDeclareWarInfoDB = new CrossDeclareWarInfoDB();
crossDeclareWarInfoDB.setId(Port.applyId());
crossDeclareWarInfoDB.setUnionId(builder.unionId);
crossDeclareWarInfoDB.setAcceptUnionId(builder.acceptUnionId);
crossDeclareWarInfoDB.setAccept(builder.eDeclare.getIndex());
crossDeclareWarInfoDB.setWartime(builder.warTime);
crossDeclareWarInfoDB.setDeclareHumanId(builder.declareHumanId);
crossDeclareWarInfoDB.setDeclareHumanName(builder.declareHumanName);
crossDeclareWarInfoDB.setDatetime(builder.dateTime);
crossDeclareWarInfoDB.persist();
} else {
crossDeclareWarInfoDB = builder.crossDeclareWarInfoDB;
}
}
创建对象:
// 方式1:
DeclareWarUnionInfo declareWarUnionInfo = new DeclareWarUnionInfo.Builder(this, db).build();
// 方式2:
DeclareWarUnionInfo createDeclareWarUnionInfo = new DeclareWarUnionInfo.Builder(this, unionId, acceptUnionId)
.addWarTime(warTime)
.addDeclareHumanId(humanId)
.addDeclareHumanName(humanName)
.build();