BAEL-6428 Make a Method Execute Only Once in Java

This commit is contained in:
AndiCover
2023-05-12 10:54:12 +02:00
parent bf2fde4f35
commit 1dd78df090
8 changed files with 156 additions and 0 deletions

View File

@@ -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++;
}
}

View File

@@ -0,0 +1,14 @@
package com.baeldung.executeonce;
final class StaticInitializer {
static int CALL_COUNT = 0;
static {
initializationLogic();
}
private static void initializationLogic() {
CALL_COUNT++;
}
}

View File

@@ -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++;
}
}

View File

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

View File

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

View File

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