package cn.trinea.android.common.entity;
import java.io.Serializable;
import cn.trinea.android.common.util.ObjectUtils;
/**
* Object in cache
*
* @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2011-12-23
*/
public class CacheObject<V> implements Serializable, Comparable<CacheObject<V>> {
private static final long serialVersionUID = 1L;
/** time first put into cache, in mills **/
protected long enterTime;
/** time last used(got), in mills **/
protected long lastUsedTime;
/** used(got) count **/
protected long usedCount;
/** priority, default is zero **/
protected int priority;
/** whether has expired, default is false **/
protected boolean isExpired;
/** whether is valid forever, default is false **/
protected boolean isForever;
/** data **/
protected V data;
public CacheObject() {
this.enterTime = System.currentTimeMillis();
this.lastUsedTime = System.currentTimeMillis();
this.usedCount = 0;
this.priority = 0;
this.isExpired = false;
this.isForever = false;
}
public CacheObject(V data) {
this();
this.data = data;
}
/**
* Get time first put into cache, in mills
*
* @return
*/
public long getEnterTime() {
return enterTime;
}
/**
* Set time first put into cache, in mills
*
* @param enterTime
*/
public void setEnterTime(long enterTime) {
this.enterTime = enterTime;
}
/**
* Get time last used(got), in mills
*
* @return
*/
public long getLastUsedTime() {
return lastUsedTime;
}
/**
* Set time last used(got), in mills
*
* @param lastUsedTime
*/
public void setLastUsedTime(long lastUsedTime) {
this.lastUsedTime = lastUsedTime;
}
/**
* Get used(got) count
*
* @return
*/
public long getUsedCount() {
return usedCount;
}
/**
* Set used(got) count
*
* @param usedCount
*/
public void setUsedCount(long usedCount) {
this.usedCount = usedCount;
}
/**
* Atomically increments by one the used(got) count
*
* @return the previous used(got) count
*/
public synchronized long getAndIncrementUsedCount() {
return usedCount++;
}
/**
* Get priority, default is zero
*
* @return
*/
public int getPriority() {
return priority;
}
/**
* Set priority, default is zero
*
* @param priority
*/
public void setPriority(int priority) {
this.priority = priority;
}
/**
* Get whether has expired, default is false
*
* @return
*/
public boolean isExpired() {
return isExpired;
}
/**
* Set whether has expired, default is false
*
* @param isExpired
*/
public void setExpired(boolean isExpired) {
this.isExpired = isExpired;
}
/**
* Get whether is valid forever, default is false
*
* @return
*/
public boolean isForever() {
return isForever;
}
/**
* Set whether is valid forever, default is false
*
* @param isForever
*/
public void setForever(boolean isForever) {
this.isForever = isForever;
}
/**
* Get data
*
* @return
*/
public V getData() {
return data;
}
/**
* Set data
*
* @param data
*/
public void setData(V data) {
this.data = data;
}
/**
* compare with data
*
* @param o
* @return
*/
@Override
public int compareTo(CacheObject<V> o) {
return o == null ? 1 : ObjectUtils.compare(this.data, o.data);
}
/**
* if data, enterTime, priority, isExpired, isForever all equals
*/
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
CacheObject<V> obj = (CacheObject<V>)(o);
return (ObjectUtils.isEquals(this.data, obj.data) && this.enterTime == obj.enterTime
&& this.priority == obj.priority && this.isExpired == obj.isExpired && this.isForever == obj.isForever);
}
@Override
public int hashCode() {
return data == null ? 0 : data.hashCode();
}
}