diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/singleton/LazyInitializedSingleton.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/singleton/LazyInitializedSingleton.java new file mode 100644 index 0000000..86fc433 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/singleton/LazyInitializedSingleton.java @@ -0,0 +1,22 @@ +package pl.mperor.lab.java.design.pattern.creational.singleton; + +public class LazyInitializedSingleton { + + private static LazyInitializedSingleton instance; + private final long time = System.currentTimeMillis(); + + private LazyInitializedSingleton() { + } + + public static synchronized LazyInitializedSingleton getInstance() { + if (instance == null) { + instance = new LazyInitializedSingleton(); + } + return instance; + } + + public long getTime() { + return time; + } + +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/singleton/Singleton.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/singleton/Singleton.java new file mode 100644 index 0000000..7f4c949 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/singleton/Singleton.java @@ -0,0 +1,19 @@ +package pl.mperor.lab.java.design.pattern.creational.singleton; + +public class Singleton { + + private static final Singleton instance = new Singleton(); + private final long time = System.currentTimeMillis(); + + private Singleton() { + } + + public static Singleton getInstance() { + return instance; + } + + public long getTime() { + return time; + } + +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/IteratorTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/IteratorTest.java new file mode 100644 index 0000000..3334f54 --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/IteratorTest.java @@ -0,0 +1,39 @@ +package pl.mperor.lab.java.design.pattern.behavioral.iterator; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class IteratorTest { + + private final List names = List.of("Adam", "Bob", "Conor"); + + @Test + public void testIteratorImperatively() { + findName("Bob"); + } + + public boolean findName(String n) { + for (int i = 0; i < names.size(); i++) { + if (names.get(i).equals(n)) { + return true; + } + } + + // same as foreach + for (String name : names) { + if (name.equals(n)) { + return true; + } + } + + return false; + } + + @Test + public void testIteratorFunctionally() { + // internal iterator + + } + +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/singleton/LazyInitializedSingletonTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/singleton/LazyInitializedSingletonTest.java new file mode 100644 index 0000000..192fbe2 --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/singleton/LazyInitializedSingletonTest.java @@ -0,0 +1,27 @@ +package pl.mperor.lab.java.design.pattern.creational.singleton; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.CompletableFuture; + +public class LazyInitializedSingletonTest { + + @Test + public void shouldOnlyAllowToLazyCreateOneInstanceOfSingleton() { + var first = CompletableFuture.supplyAsync(() -> { + System.out.println("First ..."); + return LazyInitializedSingleton.getInstance(); + }); + var second = CompletableFuture.supplyAsync(() -> { + System.out.println("Second ..."); + return LazyInitializedSingleton.getInstance(); + }); + + LazyInitializedSingleton firstResult = first.join(); + LazyInitializedSingleton secondResult = second.join(); + + Assertions.assertSame(firstResult, secondResult); + Assertions.assertEquals(firstResult.getTime(), secondResult.getTime()); + } +} \ No newline at end of file diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/singleton/SingletonTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/singleton/SingletonTest.java new file mode 100644 index 0000000..061eeb3 --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/singleton/SingletonTest.java @@ -0,0 +1,22 @@ +package pl.mperor.lab.java.design.pattern.creational.singleton; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.TimeUnit; + +public class SingletonTest { + + @Test + public void shouldOnlyAllowToCreateOneInstanceOfSingleton() throws InterruptedException { + var instance = Singleton.getInstance(); + long time = instance.getTime(); + + TimeUnit.MILLISECONDS.sleep(50); + long timeAfterBreak = Singleton.getInstance().getTime(); + + Assertions.assertSame(instance, Singleton.getInstance()); + Assertions.assertEquals(time, timeAfterBreak); + } + +} \ No newline at end of file