BAEL-6428 Make a Method Execute Only Once in Java
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
package com.baeldung.executeonce;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
final class AtomicBooleanInitializer {
|
||||
|
||||
private final AtomicBoolean isInitialized = new AtomicBoolean(false);
|
||||
int callCount = 0;
|
||||
|
||||
void initialize() {
|
||||
if (isInitialized.compareAndSet(false, true)) {
|
||||
initializationLogic();
|
||||
}
|
||||
}
|
||||
|
||||
private void initializationLogic() {
|
||||
callCount++;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.baeldung.executeonce;
|
||||
|
||||
final class StaticInitializer {
|
||||
|
||||
static int CALL_COUNT = 0;
|
||||
|
||||
static {
|
||||
initializationLogic();
|
||||
}
|
||||
|
||||
private static void initializationLogic() {
|
||||
CALL_COUNT++;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.baeldung.executeonce;
|
||||
|
||||
final class SynchronizedInitializer {
|
||||
|
||||
private static volatile boolean isInitialized = false;
|
||||
int callCount = 0;
|
||||
|
||||
synchronized void initialize() {
|
||||
if (!isInitialized) {
|
||||
initializationLogic();
|
||||
isInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void initializationLogic() {
|
||||
callCount++;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.baeldung.executeonce;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
final class AtomicBooleanInitializerUnitTest {
|
||||
|
||||
@Test
|
||||
void givenAtomicBooleanInitializer_whenRepeatedlyCallingInitialize_thenCallCountIsOne() {
|
||||
AtomicBooleanInitializer atomicBooleanInitializer = new AtomicBooleanInitializer();
|
||||
assertEquals(0, atomicBooleanInitializer.callCount);
|
||||
|
||||
atomicBooleanInitializer.initialize();
|
||||
atomicBooleanInitializer.initialize();
|
||||
atomicBooleanInitializer.initialize();
|
||||
|
||||
assertEquals(1, atomicBooleanInitializer.callCount);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.baeldung.executeonce;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
final class StaticInitializerUnitTest {
|
||||
|
||||
@Test
|
||||
void whenLoadingStaticInitializer_thenCallCountIsOne() {
|
||||
assertEquals(1, StaticInitializer.CALL_COUNT);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenInitializingStaticInitializer_thenCallCountStaysOne() {
|
||||
StaticInitializer staticInitializer = new StaticInitializer();
|
||||
assertEquals(1, StaticInitializer.CALL_COUNT);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.baeldung.executeonce;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
final class SynchronizedInitializerUnitTest {
|
||||
|
||||
@Test
|
||||
void givenSynchronizedInitializer_whenRepeatedlyCallingInitialize_thenCallCountIsOne() {
|
||||
SynchronizedInitializer synchronizedInitializer = new SynchronizedInitializer();
|
||||
assertEquals(0, synchronizedInitializer.callCount);
|
||||
|
||||
synchronizedInitializer.initialize();
|
||||
synchronizedInitializer.initialize();
|
||||
synchronizedInitializer.initialize();
|
||||
|
||||
assertEquals(1, synchronizedInitializer.callCount);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user