2013-03-24 2 views
1

Когда я прочитал источник основы игры 1.2.5, я нашел этот класс:Как понять метод `ApplicationClassloaderState # hashCode`?

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)); 

источник url: https://github.com/playframework/play/blob/master/framework/src/play/classloading/ApplicationClassloaderState.java#L34

ответ

0

hashCode() должен возвращать int по дизайну. currentStateValue - это длинное число, обозначающее изменение внутреннего состояния ApplicationClassloader. Игра! framework - сложная веб-инфраструктура с так называемой функцией замены и перезагрузки горячего кода. центральной частью реализации этой функции является play.classloading.ApplicationClassloader.detectChanges(). Как вы можете видеть, существует множество новых вызовов ApplicationClassloaderState(), что означает (быстро - в зависимости от рабочего процесса разработки и размера приложения), увеличивая член currentStateValue в возвращаемом объекте.

Возврат к вопросу: цель реализации должна заключаться в том, чтобы удерживать максимальную информацию, чтобы различать как минимум 2 разных состояния друг от друга.

попытаться понять currentStateValue как ключ (шифрование), который шифрует себя (в терминах криптологии - ужасный подход), но в этом контексте это очень полезно. Возможно, вы признаете отношения. Извините, что я не могу писать ссылки здесь, но вы можете найти полезные подсказки в википедии, которые ищут «Involution_% 28mathematics% 29», «One-time_pad», «Tabula_recta».

Смежные вопросы