Adapting the VarHandle Code to Best Practices

This commit is contained in:
Ali Dehghani 2020-05-31 23:20:10 +04:30
parent f5c5cc5290
commit 5b7dde1ae8
1 changed files with 41 additions and 41 deletions

View File

@ -6,8 +6,9 @@ import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle; import java.lang.invoke.VarHandle;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.*;
public class VariableHandlesUnitTest { public class VariableHandlesTest {
public int publicTestVariable = 1; public int publicTestVariable = 1;
private int privateTestVariable = 1; private int privateTestVariable = 1;
@ -18,25 +19,23 @@ public class VariableHandlesUnitTest {
@Test @Test
public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles VarHandle PUBLIC_TEST_VARIABLE = MethodHandles
.lookup() .lookup()
.in(VariableHandlesUnitTest.class) .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesUnitTest.class, "publicTestVariable", int.class); .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class);
assertThat(publicIntHandle.coordinateTypes().size() == 1);
assertThat(publicIntHandle.coordinateTypes().get(0) == VariableHandlesUnitTest.class);
assertEquals(1, PUBLIC_TEST_VARIABLE.coordinateTypes().size());
assertEquals(VariableHandlesTest.class, PUBLIC_TEST_VARIABLE.coordinateTypes().get(0));
} }
@Test @Test
public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
VarHandle privateIntHandle = MethodHandles VarHandle PRIVATE_TEST_VARIABLE = MethodHandles
.privateLookupIn(VariableHandlesUnitTest.class, MethodHandles.lookup()) .privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup())
.findVarHandle(VariableHandlesUnitTest.class, "privateTestVariable", int.class); .findVarHandle(VariableHandlesTest.class, "privateTestVariable", int.class);
assertThat(privateIntHandle.coordinateTypes().size() == 1);
assertThat(privateIntHandle.coordinateTypes().get(0) == VariableHandlesUnitTest.class);
assertEquals(1, PRIVATE_TEST_VARIABLE.coordinateTypes().size());
assertEquals(VariableHandlesTest.class, PRIVATE_TEST_VARIABLE.coordinateTypes().get(0));
} }
@Test @Test
@ -44,63 +43,64 @@ public class VariableHandlesUnitTest {
VarHandle arrayVarHandle = MethodHandles VarHandle arrayVarHandle = MethodHandles
.arrayElementVarHandle(int[].class); .arrayElementVarHandle(int[].class);
assertThat(arrayVarHandle.coordinateTypes().size() == 2); assertEquals(2, arrayVarHandle.coordinateTypes().size());
assertThat(arrayVarHandle.coordinateTypes().get(0) == int[].class); assertEquals(int[].class, arrayVarHandle.coordinateTypes().get(0));
} }
@Test @Test
public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles VarHandle PUBLIC_TEST_VARIABLE = MethodHandles
.lookup() .lookup()
.in(VariableHandlesUnitTest.class) .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesUnitTest.class, "publicTestVariable", int.class); .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class);
assertThat((int) publicIntHandle.get(this) == 1); assertEquals(1, (int) PUBLIC_TEST_VARIABLE.get(this));
} }
@Test @Test
public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles VarHandle VARIABLE_TO_SET = MethodHandles
.lookup() .lookup()
.in(VariableHandlesUnitTest.class) .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesUnitTest.class, "variableToSet", int.class); .findVarHandle(VariableHandlesTest.class, "variableToSet", int.class);
publicIntHandle.set(this, 15);
assertThat((int) publicIntHandle.get(this) == 15); VARIABLE_TO_SET.set(this, 15);
assertEquals(15, (int) VARIABLE_TO_SET.get(this));
} }
@Test @Test
public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles VarHandle VARIABLE_TO_COMPARE_AND_SET = MethodHandles
.lookup() .lookup()
.in(VariableHandlesUnitTest.class) .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesUnitTest.class, "variableToCompareAndSet", int.class); .findVarHandle(VariableHandlesTest.class, "variableToCompareAndSet", int.class);
publicIntHandle.compareAndSet(this, 1, 100);
assertThat((int) publicIntHandle.get(this) == 100); VARIABLE_TO_COMPARE_AND_SET.compareAndSet(this, 1, 100);
assertEquals(100, (int) VARIABLE_TO_COMPARE_AND_SET.get(this));
} }
@Test @Test
public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles VarHandle VARIABLE_TO_GET_AND_ADD = MethodHandles
.lookup() .lookup()
.in(VariableHandlesUnitTest.class) .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesUnitTest.class, "variableToGetAndAdd", int.class); .findVarHandle(VariableHandlesTest.class, "variableToGetAndAdd", int.class);
int before = (int) publicIntHandle.getAndAdd(this, 200);
assertThat(before == 0); int before = (int) VARIABLE_TO_GET_AND_ADD.getAndAdd(this, 200);
assertThat((int) publicIntHandle.get(this) == 200);
assertEquals(0, before);
assertEquals(200, (int) VARIABLE_TO_GET_AND_ADD.get(this));
} }
@Test @Test
public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles VarHandle VARIABLE_TO_BITWISE_OR = MethodHandles
.lookup() .lookup()
.in(VariableHandlesUnitTest.class) .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesUnitTest.class, "variableToBitwiseOr", byte.class); .findVarHandle(VariableHandlesTest.class, "variableToBitwiseOr", byte.class);
byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127); byte before = (byte) VARIABLE_TO_BITWISE_OR.getAndBitwiseOr(this, (byte) 127);
assertThat(before == 0); assertEquals(0, before);
assertThat(variableToBitwiseOr == 127); assertEquals(127, (byte) VARIABLE_TO_BITWISE_OR.get(this));
} }
} }