diff --git a/StudyInterfaces/.classpath b/study-annotations-and-reflection-api/.classpath
similarity index 100%
rename from StudyInterfaces/.classpath
rename to study-annotations-and-reflection-api/.classpath
diff --git a/study-annotations-and-reflection-api/.project b/study-annotations-and-reflection-api/.project
new file mode 100644
index 0000000..616f812
--- /dev/null
+++ b/study-annotations-and-reflection-api/.project
@@ -0,0 +1,17 @@
+
+
+ study-annotations-and-reflection-api
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/StudyInterfaces/.settings/org.eclipse.core.resources.prefs b/study-annotations-and-reflection-api/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from StudyInterfaces/.settings/org.eclipse.core.resources.prefs
rename to study-annotations-and-reflection-api/.settings/org.eclipse.core.resources.prefs
diff --git a/StudyInterfaces/.settings/org.eclipse.jdt.core.prefs b/study-annotations-and-reflection-api/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from StudyInterfaces/.settings/org.eclipse.jdt.core.prefs
rename to study-annotations-and-reflection-api/.settings/org.eclipse.jdt.core.prefs
diff --git a/study-annotations-and-reflection-api/src/com/example/lottery/application/LotteryApp.java b/study-annotations-and-reflection-api/src/com/example/lottery/application/LotteryApp.java
new file mode 100644
index 0000000..4f22ed4
--- /dev/null
+++ b/study-annotations-and-reflection-api/src/com/example/lottery/application/LotteryApp.java
@@ -0,0 +1,15 @@
+package com.example.lottery.application;
+
+import com.example.lottery.model.LotteryViewModel;
+import com.example.lottery.service.RandomNumberGeneratorService;
+
+public class LotteryApp {
+
+ public static void main(String[] args) {
+ var lotteryModel = new LotteryViewModel();
+ var service = new RandomNumberGeneratorService();
+ service.generate(lotteryModel);
+ System.out.println(lotteryModel.getNumbers());
+ }
+
+}
diff --git a/study-annotations-and-reflection-api/src/com/example/lottery/model/LotteryViewModel.java b/study-annotations-and-reflection-api/src/com/example/lottery/model/LotteryViewModel.java
new file mode 100644
index 0000000..125beaa
--- /dev/null
+++ b/study-annotations-and-reflection-api/src/com/example/lottery/model/LotteryViewModel.java
@@ -0,0 +1,15 @@
+package com.example.lottery.model;
+
+import java.util.List;
+
+import com.example.lottery.service.RandomNumber;
+
+public class LotteryViewModel {
+ @RandomNumber(min = 1, max = 60, distinct = true, sorted = true, size = 6)
+ private List numbers;
+
+ public List getNumbers() {
+ return numbers;
+ }
+
+}
diff --git a/study-annotations-and-reflection-api/src/com/example/lottery/service/RandomNumber.java b/study-annotations-and-reflection-api/src/com/example/lottery/service/RandomNumber.java
new file mode 100644
index 0000000..cbca84d
--- /dev/null
+++ b/study-annotations-and-reflection-api/src/com/example/lottery/service/RandomNumber.java
@@ -0,0 +1,22 @@
+package com.example.lottery.service;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RandomNumber {
+
+ int min();
+
+ int max();
+
+ boolean distinct();
+
+ boolean sorted();
+
+ int size();
+
+}
diff --git a/study-annotations-and-reflection-api/src/com/example/lottery/service/RandomNumberGeneratorService.java b/study-annotations-and-reflection-api/src/com/example/lottery/service/RandomNumberGeneratorService.java
new file mode 100644
index 0000000..5050078
--- /dev/null
+++ b/study-annotations-and-reflection-api/src/com/example/lottery/service/RandomNumberGeneratorService.java
@@ -0,0 +1,33 @@
+package com.example.lottery.service;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+public class RandomNumberGeneratorService {
+
+ public void generate(Object o) {
+ var clazz = o.getClass();
+ for (var field : clazz.getDeclaredFields()) {
+ if (field.isAnnotationPresent(RandomNumber.class)) {
+ var randomNumberAnnotation = field.getAnnotation(RandomNumber.class);
+ var min = randomNumberAnnotation.min();
+ var max = randomNumberAnnotation.max();
+ var size = randomNumberAnnotation.size();
+ var streamOfNumbers = ThreadLocalRandom.current().ints(min, max);
+ if (randomNumberAnnotation.distinct())
+ streamOfNumbers = streamOfNumbers.distinct();
+
+ streamOfNumbers = streamOfNumbers.limit(size);
+ if (randomNumberAnnotation.sorted())
+ streamOfNumbers = streamOfNumbers.sorted();
+ var numbers = streamOfNumbers.boxed().toList();
+ try {
+ field.setAccessible(true);
+ field.set(o, numbers);
+ field.setAccessible(false);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ System.err.println("Error: %s".formatted(e.getMessage()));
+ }
+ }
+ }
+ }
+}
diff --git a/study-interfaces/.classpath b/study-interfaces/.classpath
new file mode 100644
index 0000000..57bca72
--- /dev/null
+++ b/study-interfaces/.classpath
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/StudyInterfaces/.project b/study-interfaces/.project
similarity index 100%
rename from StudyInterfaces/.project
rename to study-interfaces/.project
diff --git a/study-interfaces/.settings/org.eclipse.core.resources.prefs b/study-interfaces/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/study-interfaces/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/study-interfaces/.settings/org.eclipse.jdt.core.prefs b/study-interfaces/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8c9943d
--- /dev/null
+++ b/study-interfaces/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,14 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/StudyInterfaces/src/com/example/Exercise01.java b/study-interfaces/src/com/example/Exercise01.java
similarity index 100%
rename from StudyInterfaces/src/com/example/Exercise01.java
rename to study-interfaces/src/com/example/Exercise01.java
diff --git a/StudyInterfaces/src/com/example/Exercise02.java b/study-interfaces/src/com/example/Exercise02.java
similarity index 100%
rename from StudyInterfaces/src/com/example/Exercise02.java
rename to study-interfaces/src/com/example/Exercise02.java
diff --git a/StudyInterfaces/src/com/example/Exercise03.java b/study-interfaces/src/com/example/Exercise03.java
similarity index 100%
rename from StudyInterfaces/src/com/example/Exercise03.java
rename to study-interfaces/src/com/example/Exercise03.java
diff --git a/study-utility-classes/.classpath b/study-utility-classes/.classpath
new file mode 100644
index 0000000..57bca72
--- /dev/null
+++ b/study-utility-classes/.classpath
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/study-utility-classes/.project b/study-utility-classes/.project
new file mode 100644
index 0000000..2842767
--- /dev/null
+++ b/study-utility-classes/.project
@@ -0,0 +1,17 @@
+
+
+ study-utility-classes
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/study-utility-classes/.settings/org.eclipse.core.resources.prefs b/study-utility-classes/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/study-utility-classes/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/study-utility-classes/.settings/org.eclipse.jdt.core.prefs b/study-utility-classes/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8c9943d
--- /dev/null
+++ b/study-utility-classes/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,14 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/study-utility-classes/src/com/example/StudyCollation.java b/study-utility-classes/src/com/example/StudyCollation.java
new file mode 100644
index 0000000..9b48124
--- /dev/null
+++ b/study-utility-classes/src/com/example/StudyCollation.java
@@ -0,0 +1,44 @@
+package com.example;
+
+import java.text.Collator;
+import java.text.ParseException;
+import java.text.RuleBasedCollator;
+import java.util.ArrayList;
+import java.util.Locale;
+
+public class StudyCollation {
+
+ public static void main(String[] args) throws ParseException {
+ var name1 = "müller";
+ var name2 = "mueller";
+ System.out.println(name1.equals(name2));
+ var names = new ArrayList();
+ names.add("şule");
+ names.add("şima");
+ names.add("sema");
+ names.add("ayşegül");
+ names.add("zehra");
+ names.add("ali");
+ names.add("veli");
+ System.out.println(names);
+ names.sort(String::compareTo);
+ System.out.println(names);
+ // şule == schule
+ System.out.println("şule".equals("schule"));
+ // şima == shema
+ System.out.println("şima".equals("shema"));
+ String basicRules= "< z < b < c < ç < d < e < f < g < ğ < h "+
+ "< ı < i < j < k < l < m < n < o < ö < p "+
+ "< r < s < ş < t < u < ü < v < y < a ";
+ String trExpension= "& şi ; she & ş ; sch & s ; ş & u ; ü & i ; ı " +
+ "& c ; ç & o ; ö & ğ ; g" ;
+ final Collator collator= new RuleBasedCollator(basicRules + trExpension);
+ Collator.getInstance(new Locale("tr","TR"));
+ collator.setStrength(Collator.PRIMARY);
+ System.out.println(collator.equals("şule","schule"));
+ System.out.println(collator.equals("şima","shema"));
+ names.sort(collator::compare);
+ System.out.println(names);
+ }
+
+}
diff --git a/study-utility-classes/src/com/example/StudyDynamicString.java b/study-utility-classes/src/com/example/StudyDynamicString.java
new file mode 100644
index 0000000..e52fc77
--- /dev/null
+++ b/study-utility-classes/src/com/example/StudyDynamicString.java
@@ -0,0 +1,20 @@
+package com.example;
+
+public class StudyDynamicString {
+
+ @SuppressWarnings("unused")
+ public static void main(String[] args) {
+ String name = "jack"; // immutable
+ int result = 42;
+ // StringBuilder: not thread-safe
+ // StringBuffer: thread-safe
+ StringBuffer message = new StringBuffer(388888890);
+ var start = System.currentTimeMillis();
+ for (var i=0;i<50_000_000;++i)
+ message.append(i);
+ var stop = System.currentTimeMillis();
+ System.out.println(message.length());
+ System.err.println("Duration: %d".formatted(stop-start));
+ }
+
+}
diff --git a/study-utility-classes/src/com/example/StudyString.java b/study-utility-classes/src/com/example/StudyString.java
new file mode 100644
index 0000000..ad555ad
--- /dev/null
+++ b/study-utility-classes/src/com/example/StudyString.java
@@ -0,0 +1,39 @@
+package com.example;
+
+import java.text.DecimalFormat;
+import java.text.MessageFormat;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class StudyString {
+
+ public static void main(String[] args) {
+ System.setProperty("user.language", "tr"); // ISO2
+ System.setProperty("user.country", "TR");
+ System.getenv().forEach((key,value) -> System.out.println("%s: %s".formatted(key,value)));
+ System.getProperties().forEach((key,value) -> System.out.println("%s: %s".formatted(key,value)));
+ String city = "izmir";
+ Locale tr_TR= new Locale("tr", "TR");
+ System.out.println(city.toUpperCase(tr_TR));
+
+ var now = ZonedDateTime.now();
+ DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
+ .withLocale(Locale.GERMAN);
+ System.out.println(dtf.format(now));
+
+ double money = 12_345.67;
+ DecimalFormat df = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.CHINA);
+ System.out.println(df.format(money));
+
+ String fullname= "Jack Bauer";
+ var resourceBundle= ResourceBundle.getBundle("messages",Locale.US);
+ var helloTemplate = resourceBundle.getString("hello");
+ var formatter = new MessageFormat(helloTemplate, tr_TR);
+
+ System.out.println(formatter.format(new Object[] {fullname}));
+ }
+
+}
diff --git a/study-utility-classes/src/messages_en_US.properties b/study-utility-classes/src/messages_en_US.properties
new file mode 100644
index 0000000..ce6bf53
--- /dev/null
+++ b/study-utility-classes/src/messages_en_US.properties
@@ -0,0 +1 @@
+hello:Hello, {0}!
\ No newline at end of file
diff --git a/study-utility-classes/src/messages_tr_TR.properties b/study-utility-classes/src/messages_tr_TR.properties
new file mode 100644
index 0000000..d035351
--- /dev/null
+++ b/study-utility-classes/src/messages_tr_TR.properties
@@ -0,0 +1 @@
+hello=Merhaba, {0}!
\ No newline at end of file