2021SC@SDUSC
前言
本节介绍DataTree类内部的三个辅助类
ProcessTxnResult
ProcessTxnResult是内部静态类
成员变量:
public long clientId;
public int cxid;
public long zxid;
public int err;
public int type;
public String path;
public Stat stat;
public List<ProcessTxnResult> multiResult;
函数方法:
//相等被定义为cleantId和cxid相同,这允许我们用哈希表跟踪事务的完成情况
public boolean equals(Object o) {
//首先确保比较的对象也是属于ProcessTxnResult类的
if (o instanceof ProcessTxnResult) {
ProcessTxnResult other = (ProcessTxnResult) o;
return other.clientId == clientId && other.cxid == cxid;
}
return false;
}
//遵循相等的对象通常hashCode也要一致的原则,以下计算hashCode的方法也只涉及clientId和cxid
public int hashCode() {
return (int) ((clientId ^ cxid) % Integer.MAX_VALUE);
}
?
Counts
Counts是内部静态类,该类极为简单,只是为了做简单的封装
private static class Counts {
long bytes;
int count;
}
ZxidDigest
一个辅助类,用来维护事务ID的摘要信息
成员变量:
//事务id
long zxid;
// 事务id对应的digest
long digest;
// digest计算方式的version,zookeeper项目每次修改计算方式,版本号会加一
int digestVersion;
构造函数:
//调用另一个构造函数,变相实现默认参数
ZxidDigest() {
this(0, digestCalculator.getDigestVersion(), 0);
}
ZxidDigest(long zxid, int digestVersion, long digest) {
this.zxid = zxid;
this.digestVersion = digestVersion;
this.digest = digest;
}
PS:在zookeeper中,或者更一般地,在java编程里,类似这样的构造函数的写法都是很常见的,这实际上就是变相做到了给函数提供默认参数。函数重载和默认参数若同时支持,会出现二义性问题,java为了keep it simple,只支持函数重载。
作为一个简单的辅助类,其函数方法都是很简单的。
三个成员变量对应的get方法:
public long getZxid() {
return zxid;
}
public int getDigestVersion() {
return digestVersion;
}
public long getDigest() {
return digest;
}
序列化,反序列化方法:
public void serialize(OutputArchive oa) throws IOException {
oa.writeLong(zxid, "zxid");
oa.writeInt(digestVersion, "digestVersion");
oa.writeLong(digest, "digest");
}
public void deserialize(InputArchive ia) throws IOException {
zxid = ia.readLong("zxid");
digestVersion = ia.readInt("digestVersion");
if (digestVersion < 2) {
String d = ia.readString("digest");
if (d != null) {
digest = Long.parseLong(d, 16);
}
} else {
digest = ia.readLong("digest");
}
}
|