Skip to content

Commit

Permalink
static of(..)-method added to reduce instances
Browse files Browse the repository at this point in the history
  • Loading branch information
oboehm committed Jun 12, 2018
1 parent b0602b1 commit 48e5c4b
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 0 deletions.
57 changes: 57 additions & 0 deletions src/main/java/de/jfachwert/rechnung/Rechnungsmonat.java
Expand Up @@ -28,6 +28,8 @@
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Locale;
import java.util.Map;
import java.util.WeakHashMap;

/**
* Vor allem bei Abonnements oder bei wiederkehrenden Gebuehren findet man
Expand All @@ -50,6 +52,7 @@
*/
public class Rechnungsmonat implements Fachwert {

private static final Map<Short, Rechnungsmonat> CACHE = new WeakHashMap<>();
private static final Range<Integer> VALID_MONTH_RANGE = Range.between(1, 12);
private static final Range<Integer> VALID_YEAR_RANGE = Range.between(0, 9999);
private static final String MONTH = "month";
Expand Down Expand Up @@ -127,6 +130,60 @@ public Rechnungsmonat(Month monat, int jahr) {
this(monat.getValue(), jahr);
}

/**
* Die of-Methode liefert fuer denselben Rechnungsmonata auch dasselbe
* Objekt zurueck. D.h. zwei gleiche Rechnungsmonate werden nur einmal
* angelegt, wenn sie ueber diese Methode angelegt werden. Das lohnt sich
* vor allem dann, wenn man viele gleiche Rechnungsmonate hat und sich den
* Overhead eines Objekts sparen will.
*
* @param date Datum
* @return einen Rechnungsmonat
*/
public static Rechnungsmonat of(LocalDate date) {
return of(new Rechnungsmonat(date));
}

/**
* Die of-Methode liefert fuer denselben Rechnungsmonata auch dasselbe
* Objekt zurueck. D.h. zwei gleiche Rechnungsmonate werden nur einmal
* angelegt, wenn sie ueber diese Methode angelegt werden. Das lohnt sich
* vor allem dann, wenn man viele gleiche Rechnungsmonate hat und sich den
* Overhead eines Objekts sparen will.
*
* @param monat zwischen 1 und 12
* @param jahr vierstellige Zahl zwischen -2730 und +2730
* @return einen Rechnungsmonat
*/
public static Rechnungsmonat of(int monat, int jahr) {
return of(new Rechnungsmonat(monat, jahr));
}

/**
* Die of-Methode liefert fuer denselben Rechnungsmonata auch dasselbe
* Objekt zurueck. D.h. zwei gleiche Rechnungsmonate werden nur einmal
* angelegt, wenn sie ueber diese Methode angelegt werden. Das lohnt sich
* vor allem dann, wenn man viele gleiche Rechnungsmonate hat und sich den
* Overhead eines Objekts sparen will.
* <p>
* Diese Methode dient dazu, um ein "ueberfluessige" Rechnungsmonate, die
* durch Aufruf anderer Methoden entstanden sind, dem Garbage Collector
* zum Aufraeumen zur Verfuegung zu stellen.
* </p>
*
* @param other anderer Rechnungsmonat
* @return einen (bereits instanziierten) Rechnungsmonat
*/
public static Rechnungsmonat of(Rechnungsmonat other) {
Short key = other.monate;
Rechnungsmonat alreadyCreated = CACHE.get(key);
if (alreadyCreated == null) {
alreadyCreated = other;
CACHE.put(key, other);
}
return alreadyCreated;
}

private static LocalDate toLocalDate(String monat) {
String normalized = monat.replaceAll("[/.\\s]", "-");
String[] parts = monat.split("-");
Expand Down
11 changes: 11 additions & 0 deletions src/test/java/de/jfachwert/rechnung/RechnungsmonatTest.java
Expand Up @@ -211,4 +211,15 @@ private static void assertNotWeekend(LocalDate localDate) {
assertThat(localDate.getDayOfWeek(), not(DayOfWeek.SUNDAY));
}

/**
* Testmethode fuer {@link Rechnungsmonat#of(int, int)}.
*/
@Test
public void testOf() {
Rechnungsmonat m1 = Rechnungsmonat.of(6, 2018);
Rechnungsmonat m2 = Rechnungsmonat.of(LocalDate.of(2018, 6, 15));
assertEquals(m1, m2);
assertSame(m1, m2);
}

}

0 comments on commit 48e5c4b

Please sign in to comment.