如何理解`ApplicationClassloaderState#hashCode`的方法?

时间:2013-03-24 14:02:35

标签: playframework-1.x

当我阅读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));

源网址:https://github.com/playframework/play/blob/master/framework/src/play/classloading/ApplicationClassloaderState.java#L34

1 个答案:

答案 0 :(得分:0)

hashCode()必须按设计返回int。 currentStateValue是一个长数字,表示ApplicationClassloader的内部状态更改。表演!框架是一个复杂的Web框架,具有所谓的热代码替换和重新加载功能。此功能实现的核心部分是play.classloading.ApplicationClassloader.detectChanges()。 正如您所看到的,有许多“新的ApplicationClassloaderState()”调用,这意味着(快速 - 取决于您的开发工作流程和应用程序大小)增加返回对象中的currentStateValue成员。

回到问题:实现目标应该是保留最大信息,以区分至少2种不同的状态。

尝试将currentStateValue理解为加密自身的(加密)密钥(在kryptology术语中是一种可怕的方法)但在这种情况下它非常有用。 也许你认识到这种关系。 对不起,我无法在这里发布链接,但你可以在维基百科中找到一些有用的提示,搜索“Involution_%28mathematics%29”,“One-time_pad”,“Tabula_recta”。