Skip to content

Commit

Permalink
interne Darstellung umgebaut
Browse files Browse the repository at this point in the history
  • Loading branch information
oboehm committed Mar 29, 2018
1 parent d3501a9 commit 355cc73
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 6 deletions.
55 changes: 49 additions & 6 deletions src/main/java/de/jfachwert/math/Nummer.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,32 @@
*/
package de.jfachwert.math;

import de.jfachwert.AbstractFachwert;
import de.jfachwert.Fachwert;
import de.jfachwert.pruefung.exception.InvalidValueException;

import java.math.BigInteger;
import java.util.Objects;

/**
* Die Klasse Nummer dient zum Abspeichern einer beliebigen Nummer. Eine Nummer
* ist eine positive Ganzzahl und beginnt ueblicherweise mit 1. Dabei kann es
* sich um eine laufende Nummer, Start-Nummer, Trikot-Nummer, ... handeln.
* <p>
* Die Klasse ist Speicher-optimiert, um auch eine große Zahl von Nummern im
* Speicher halten zu koennen. Und man kann damit auch Zahlen mit fuehrenden
* Nullen (wie z.B. PLZ) damit abbilden.
* </p>
* <p>
* Urspruenglich war diese Klasse als Ergaenzung zur {@link de.jfachwert.Text}-
* Klasse gedacht.
* </p>
*
* @author oboehm
* @since 0.6 (24.01.2018)
*/
public class Nummer extends AbstractFachwert<BigInteger> {
public class Nummer implements Fachwert {

private final String code;

/**
* Erzeugt eine Nummer als positive Ganzzahl.
Expand All @@ -51,7 +59,7 @@ public Nummer(long code) {
* @param code z.B. "42"
*/
public Nummer(String code) {
this(new BigInteger(validate(code)));
this.code = code;
}

/**
Expand All @@ -60,7 +68,7 @@ public Nummer(String code) {
* @param code eine beliebige Zahl
*/
public Nummer(BigInteger code) {
super(code);
this(code.toString());
}

/**
Expand All @@ -83,7 +91,42 @@ public static String validate(String nummer) {
* @return z.B. 42
*/
public int intValue() {
return this.getCode().intValue();
return Integer.parseInt(code);
}


/**
* Zwei Nummer sind dann gleich, wenn sie exact gleich geschrieben werden.
* D.h. fuehrende Nullen werden beim Vergleich nicht ignoriert.
*
* @param obj
* @return
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Nummer)) {
return false;
}
Nummer other = (Nummer) obj;
return this.toString().equals(other.toString());
}

/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return Objects.hash(code);
}

/**
* Hier wird die Nummer inklusive fuehrende Null (falls vorhanden)
* ausgegeben.
*
* @return z.B. "0711"
*/
@Override
public String toString() {
return this.code.toString();
}

}
23 changes: 23 additions & 0 deletions src/test/java/de/jfachwert/math/NummerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,14 @@

import de.jfachwert.AbstractFachwertTest;
import org.junit.Test;
import patterntesting.runtime.util.Converter;

import java.io.NotSerializableException;

import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

/**
* Unit-Tests fuer {@link Nummer}-Klasse.
Expand All @@ -43,4 +49,21 @@ public void testGet() {
assertEquals(4711, nummer.intValue());
}

/**
* Hier wird die Groesse des Objekts getestet. Als String abgespeichert
* verbraucht eine vierstellig Zahl ca. 80 Bytes. Die gilt es zu
* unterbieten.
*
* @throws NotSerializableException sollte nicht passieren
*/
@Test
public void testObjectSize() throws NotSerializableException {
Nummer einstellig = new Nummer("1");
Nummer fuenfstellig = new Nummer("70839");
long n = Converter.serialize(fuenfstellig).length;
long diff = n - Converter.serialize(einstellig).length;
assertThat(n, lessThan(100L));
assertThat(diff, lessThanOrEqualTo(4L));
}

}

0 comments on commit 355cc73

Please sign in to comment.