HHH-8683 Making EnumState a parameterized class, thus allowing to access its value more safely
This commit is contained in:
parent
4a38b25ec1
commit
b95b8514d8
|
@ -174,7 +174,7 @@ public final class EntityEntry implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public LockMode getLockMode() {
|
public LockMode getLockMode() {
|
||||||
return getCompressedValue( EnumState.LOCK_MODE, LockMode.class );
|
return getCompressedValue( EnumState.LOCK_MODE );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLockMode(LockMode lockMode) {
|
public void setLockMode(LockMode lockMode) {
|
||||||
|
@ -182,11 +182,11 @@ public final class EntityEntry implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Status getStatus() {
|
public Status getStatus() {
|
||||||
return getCompressedValue( EnumState.STATUS, Status.class );
|
return getCompressedValue( EnumState.STATUS );
|
||||||
}
|
}
|
||||||
|
|
||||||
private Status getPreviousStatus() {
|
private Status getPreviousStatus() {
|
||||||
return getCompressedValue( EnumState.PREVIOUS_STATUS, Status.class );
|
return getCompressedValue( EnumState.PREVIOUS_STATUS );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(Status status) {
|
public void setStatus(Status status) {
|
||||||
|
@ -552,7 +552,7 @@ public final class EntityEntry implements Serializable {
|
||||||
* the value to store; The caller must make sure that it matches
|
* the value to store; The caller must make sure that it matches
|
||||||
* the given identifier
|
* the given identifier
|
||||||
*/
|
*/
|
||||||
private void setCompressedValue(EnumState state, Enum<?> value) {
|
private <E extends Enum<E>> void setCompressedValue(EnumState<E> state, E value) {
|
||||||
// reset the bits for the given property to 0
|
// reset the bits for the given property to 0
|
||||||
compressedState &= state.getUnsetMask();
|
compressedState &= state.getUnsetMask();
|
||||||
// store the numeric representation of the enum value at the right offset
|
// store the numeric representation of the enum value at the right offset
|
||||||
|
@ -564,17 +564,12 @@ public final class EntityEntry implements Serializable {
|
||||||
*
|
*
|
||||||
* @param state
|
* @param state
|
||||||
* identifies the value to store
|
* identifies the value to store
|
||||||
* @param type
|
|
||||||
* the actual enum type of the given property; The caller must
|
|
||||||
* make sure that it matches the given identifier
|
|
||||||
* @return the current value of the specified property
|
* @return the current value of the specified property
|
||||||
*/
|
*/
|
||||||
private <E extends Enum<?>> E getCompressedValue(EnumState state, Class<E> type) {
|
private <E extends Enum<E>> E getCompressedValue(EnumState<E> state) {
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
E[] enumConstants = (E[]) state.getEnumConstants();
|
|
||||||
// restore the numeric value from the bits at the right offset and return the corresponding enum constant
|
// restore the numeric value from the bits at the right offset and return the corresponding enum constant
|
||||||
int index = ( ( compressedState & state.getMask() ) >> state.getOffset() ) - 1;
|
int index = ( ( compressedState & state.getMask() ) >> state.getOffset() ) - 1;
|
||||||
return index == - 1 ? null : enumConstants[index];
|
return index == - 1 ? null : state.getEnumConstants()[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -606,18 +601,18 @@ public final class EntityEntry implements Serializable {
|
||||||
*
|
*
|
||||||
* @author Gunnar Morling
|
* @author Gunnar Morling
|
||||||
*/
|
*/
|
||||||
private enum EnumState {
|
private static class EnumState<E extends Enum<E>> {
|
||||||
|
|
||||||
LOCK_MODE(0, LockMode.class),
|
private static final EnumState<LockMode> LOCK_MODE = new EnumState<LockMode>( 0, LockMode.class );
|
||||||
STATUS(4, Status.class),
|
private static final EnumState<Status> STATUS = new EnumState<Status>( 4, Status.class );
|
||||||
PREVIOUS_STATUS(8, Status.class);
|
private static final EnumState<Status> PREVIOUS_STATUS = new EnumState<Status>( 8, Status.class );
|
||||||
|
|
||||||
private final int offset;
|
private final int offset;
|
||||||
private Object[] enumConstants;
|
private final E[] enumConstants;
|
||||||
private final int mask;
|
private final int mask;
|
||||||
private final int unsetMask;
|
private final int unsetMask;
|
||||||
|
|
||||||
private <E extends Enum<?>> EnumState(int offset, Class<E> enumType) {
|
private EnumState(int offset, Class<E> enumType) {
|
||||||
E[] enumConstants = enumType.getEnumConstants();
|
E[] enumConstants = enumType.getEnumConstants();
|
||||||
|
|
||||||
// In case any of the enums cannot be stored in 4 bits anymore, we'd have to re-structure the compressed
|
// In case any of the enums cannot be stored in 4 bits anymore, we'd have to re-structure the compressed
|
||||||
|
@ -640,7 +635,7 @@ public final class EntityEntry implements Serializable {
|
||||||
/**
|
/**
|
||||||
* Returns the numeric value to be stored for the given enum value.
|
* Returns the numeric value to be stored for the given enum value.
|
||||||
*/
|
*/
|
||||||
private int getValue(Enum<?> value) {
|
private int getValue(E value) {
|
||||||
return value != null ? value.ordinal() + 1 : 0;
|
return value != null ? value.ordinal() + 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -668,7 +663,7 @@ public final class EntityEntry implements Serializable {
|
||||||
/**
|
/**
|
||||||
* Returns the constants of the represented enum which is cached for performance reasons.
|
* Returns the constants of the represented enum which is cached for performance reasons.
|
||||||
*/
|
*/
|
||||||
private Object[] getEnumConstants() {
|
private E[] getEnumConstants() {
|
||||||
return enumConstants;
|
return enumConstants;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue