From d065736bf472a675587ba0a06e03bc202efad0d4 Mon Sep 17 00:00:00 2001 From: AndiCover Date: Fri, 12 May 2023 10:54:12 +0200 Subject: [PATCH] BAEL-6428 Make a Method Execute Only Once in Java --- core-java-modules/core-java-methods/README.md | 6 +++ core-java-modules/core-java-methods/pom.xml | 40 +++++++++++++++++++ .../executeonce/AtomicBooleanInitializer.java | 19 +++++++++ .../executeonce/StaticInitializer.java | 14 +++++++ .../executeonce/SynchronizedInitializer.java | 18 +++++++++ .../AtomicBooleanInitializerUnitTest.java | 20 ++++++++++ .../StaticInitializerUnitTest.java | 19 +++++++++ .../SynchronizedInitializerUnitTest.java | 20 ++++++++++ 8 files changed, 156 insertions(+) create mode 100644 core-java-modules/core-java-methods/README.md create mode 100644 core-java-modules/core-java-methods/pom.xml create mode 100644 core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/AtomicBooleanInitializer.java create mode 100644 core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/StaticInitializer.java create mode 100644 core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/SynchronizedInitializer.java create mode 100644 core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/AtomicBooleanInitializerUnitTest.java create mode 100644 core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/StaticInitializerUnitTest.java create mode 100644 core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/SynchronizedInitializerUnitTest.java diff --git a/core-java-modules/core-java-methods/README.md b/core-java-modules/core-java-methods/README.md new file mode 100644 index 0000000000..b2208778e7 --- /dev/null +++ b/core-java-modules/core-java-methods/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java Methods + +### Relevant Articles: +- [Execute a Method Only Once in Java](https://www.baeldung.com/execute-a-method-only-once-in-java) \ No newline at end of file diff --git a/core-java-modules/core-java-methods/pom.xml b/core-java-modules/core-java-methods/pom.xml new file mode 100644 index 0000000000..5502cc6733 --- /dev/null +++ b/core-java-modules/core-java-methods/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + core-java-methods + 0.1.0-SNAPSHOT + core-java-methods + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + core-java-methods + + + src/main/resources + true + + + + + + 3.22.0 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/AtomicBooleanInitializer.java b/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/AtomicBooleanInitializer.java new file mode 100644 index 0000000000..72ffc42711 --- /dev/null +++ b/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/AtomicBooleanInitializer.java @@ -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++; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/StaticInitializer.java b/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/StaticInitializer.java new file mode 100644 index 0000000000..2896578a8c --- /dev/null +++ b/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/StaticInitializer.java @@ -0,0 +1,14 @@ +package com.baeldung.executeonce; + +final class StaticInitializer { + + static int CALL_COUNT = 0; + + static { + initializationLogic(); + } + + private static void initializationLogic() { + CALL_COUNT++; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/SynchronizedInitializer.java b/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/SynchronizedInitializer.java new file mode 100644 index 0000000000..79c5fb9c3c --- /dev/null +++ b/core-java-modules/core-java-methods/src/main/java/com/baeldung/executeonce/SynchronizedInitializer.java @@ -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++; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/AtomicBooleanInitializerUnitTest.java b/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/AtomicBooleanInitializerUnitTest.java new file mode 100644 index 0000000000..8d72ded2cb --- /dev/null +++ b/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/AtomicBooleanInitializerUnitTest.java @@ -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); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/StaticInitializerUnitTest.java b/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/StaticInitializerUnitTest.java new file mode 100644 index 0000000000..a1620069ee --- /dev/null +++ b/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/StaticInitializerUnitTest.java @@ -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); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/SynchronizedInitializerUnitTest.java b/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/SynchronizedInitializerUnitTest.java new file mode 100644 index 0000000000..50eca7c5b7 --- /dev/null +++ b/core-java-modules/core-java-methods/src/test/java/com/baeldung/executeonce/SynchronizedInitializerUnitTest.java @@ -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); + } +} \ No newline at end of file