package jef.common; import org.apache.commons.lang.ArrayUtils; /** * * @author jiyi * */ public abstract class MarkableObject { private int[] bitField_=new int[getMarkNums()]; private static int[] POWER_OF_2=new int[]{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216, 33554432,67108864,134217728,268435456,0x20000000,0x40000000,0x80000000}; /** * * @return */ protected abstract String[] getFieldNames(); protected abstract int getMarkNums(); /** * 序号从0开始 * @param n * @param value */ public void _onFieldSet(int n,Object value){ int llFieldBit = POWER_OF_2[n%32]; bitField_[n/32]|=llFieldBit; } /** * * @param n * @return */ public boolean _isFieldSet(int n){ int llFieldBit = POWER_OF_2[n%32]; return (bitField_[n/32]&llFieldBit)>0; } public boolean _isFieldSet(String n){ int index=ArrayUtils.indexOf(getFieldNames(),n); if(index>-1){ return _isFieldSet(index); }else{ throw new IllegalArgumentException(n); } } }