当我阅读play framework 1.2.5的源代码时,我找到了这个类:
package play.classloading;
import java.util.concurrent.atomic.AtomicLong;
/**
* Each unique instance of this class represent a State of the ApplicationClassloader.
* When some classes is reloaded, them the ApplicationClassloader get a new state.
* <p/>
* This makes it easy for other parts of Play to cache stuff based on the
* the current State of the ApplicationClassloader..
* <p/>
* They can store the reference to the current state, then later, before reading from cache,
* they could check if the state of the ApplicationClassloader has changed..
*/
public class ApplicationClassloaderState {
private static AtomicLong nextStateValue = new AtomicLong();
private final long currentStateValue = nextStateValue.getAndIncrement();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ApplicationClassloaderState that = (ApplicationClassloaderState) o;
if (currentStateValue != that.currentStateValue) return false;
return true;
}
@Override
public int hashCode() {
return (int) (currentStateValue ^ (currentStateValue >>> 32));
}
}
我不理解hashCode
方法,为什么它使用此实现:
return (int) (currentStateValue ^ (currentStateValue >>> 32));
答案 0 :(得分:0)
hashCode()必须按设计返回int。 currentStateValue是一个长数字,表示ApplicationClassloader的内部状态更改。表演!框架是一个复杂的Web框架,具有所谓的热代码替换和重新加载功能。此功能实现的核心部分是play.classloading.ApplicationClassloader.detectChanges()。 正如您所看到的,有许多“新的ApplicationClassloaderState()”调用,这意味着(快速 - 取决于您的开发工作流程和应用程序大小)增加返回对象中的currentStateValue成员。
回到问题:实现目标应该是保留最大信息,以区分至少2种不同的状态。
尝试将currentStateValue理解为加密自身的(加密)密钥(在kryptology术语中是一种可怕的方法)但在这种情况下它非常有用。 也许你认识到这种关系。 对不起,我无法在这里发布链接,但你可以在维基百科中找到一些有用的提示,搜索“Involution_%28mathematics%29”,“One-time_pad”,“Tabula_recta”。