Java项目C中 有一处逻辑,对于资源数据(类型为ResourceItem,拥有int/double/boolean/String类型数十个字段),需要比对资源数据每次变更的差异,并描述出变更情况。并非所有的字段都需要比对,如id字段则不参与比对。
依次比对每一个字段编写代码比对,将是个重苦力活。高级语言给予了我们诸多便利,应当加以利用。
首先定义自己的注解,value值用作字段描述
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface RevisionColumn { String value(); }
为ResourceItem所有待比对字段添加该注解,如
public class ResourceItem { private int id; private int revision; private ResourceItemStatus status; @RevisionColumn("节点") private String node; @RevisionColumn("是否物理隔离") private boolean physicalIsolation; @RevisionColumn("整机:单盘上限(%)") private int machineDiskLimit; //... }
介绍比对逻辑前,首先定义记录对象字段差异的实体类型
public class FieldChangeInfo implements Serializable{ private String propertyName; private String propertyHeader; private Object from; private Object to; public FieldChangeInfo() { } public FieldChangeInfo(String propertyName, String propertyHeader, Object from, Object to) { this.propertyName = propertyName; this.propertyHeader = propertyHeader; this.from = from; this.to = to; } @Override public boolean equals(Object obj) { if (!(obj instanceof FieldChangeInfo)) return false; if (obj == this) return true; FieldChangeInfo rhs = (FieldChangeInfo) obj; return new EqualsBuilder(). append(propertyName, rhs.propertyName). append(propertyHeader, rhs.propertyHeader). append(from, rhs.from). append(to, rhs.to). isEquals(); } public String getPropertyName() { return propertyName; } public void setPropertyName(String propertyName) { this.propertyName = propertyName; } public String getPropertyHeader() { return propertyHeader; } public void setPropertyHeader(String propertyHeader) { this.propertyHeader = propertyHeader; } public Object getFrom() { return from; } public void setFrom(Object from) { this.from = from; } public Object getTo() { return to; } public void setTo(Object to) { this.to = to; } }