Welche Datentypen für Telefonnummer, E-Mail, Geburtsdatum, Augenfarbe,

Hallo,

ich habe o.g. Informationen in einem Objekt zu halten, die ich aus einer Datenbank beziehen werde.

Welche Datentypen in Java eignen sich dafür?
Eine Telefonnummer kann eine Länder- und eine Ortsvorwahl enthalten. String?
Gibt es eine fertige Klassen, die (Augen)Farben bereitstellt? Wenn nicht, soll ich hier ein enum verwenden?
Für das Geburtsdatum habe ich bisher java.util.Calendar genutzt.

Was sagt ihr dazu?

also ‚java farbe‘ in eine Suchmaschine und dann für die ersten Ergebnisse schon in den Vorschautexten

Für die Darstellung von Farben besitzt Java die Klasse Color.

Die Klasse Color stellt eine Farbe dar, die nach dem RBG-Modell zusammengesetzt ist.

Color. Die Klasse java.awt.Color bietet das gesamte Farbspektrum in Java.

Die Farben können mit folgenden Methoden geändert werden: … Damit man in diesen Methoden Farben verwenden kann, muss mit import java.awt.Color;

zu lesen sollte diese Frage nochmal zu denken geben

freilich ist die Java-Color nicht gerade 1 zu 1 in DB zu gebrauchen,
mit String oder Enum liegst du besser, richtig, wobei Enum auch zu String wird,
entweder selbst so umgesetzt oder mit einer besonders geeigneten Hilfsklasse (bei Hibernate nutze ich mehr oder weniger freiwillig https://developer.jboss.org/wiki/Java5EnumUserType?_sscc=t ) oder im verwendeten Java-Framework allgemein unterstützt

was willst du mit der Farbe dann eigentlich machen?

  • nur in Formularen ausgeben, dann würde String eh reichen,
  • etwas (Augen :wink: ) bunt malen, dann besser damit beschäftigen, dann wüßtest du mehr zu Farben in Java

interessanter als die Java-Seite ist doch das SQL-Datenmodell,
Date gibt es dort als einer der wenigen höheren Typen (neben Zahlen und Zeichenketten), Farbe bereits nicht

auch für Date ist Text-Darstellung nicht ganz fernliegend, wenn im Programm überhaupt nicht als Date genuzt, keine Sortierung, keine Zeit-Vergleiche, kein graphisches Kalender-Auswahl-Tool

spätes edit: ach ja, Telefonnummer (Suche schadet da auch nicht, wird aber wohl nicht viel finden),
ich kenne da nichts in Java, glaube auch nicht dran, String reicht

[QUOTE=147852369]Welche Datentypen in Java eignen sich dafür?
Eine Telefonnummer kann eine Länder- und eine Ortsvorwahl enthalten. String?
Gibt es eine fertige Klassen, die (Augen)Farben bereitstellt? Wenn nicht, soll ich hier ein enum verwenden?
Für das Geburtsdatum habe ich bisher java.util.Calendar genutzt.[/QUOTE]

Calendar ist eigentlich auch schon viel zu genau. Calendar basiert auf long Millisekunden seit 1.1.79 + Zeitzone und Verschiebung und so. D. h. du erstellst ein neues Calendar-Objekt und das ist dann zunächst auf die Systemzeit user eingestellt, wenn du 3 “Felder” veränderst, sind die Millisekunden für den jeweiligen Tag immer noch nicht auf 0.

Idee: 2015-02-23 oder 1800-02-23, wenn unbekannt.

Bei Telefonnummern hab ich schon alles Mögliche gesehen,: 0049, 049, +49, dazwischen Leer, +, -, Phantasie, … (2x, 3x, …)

Die (Augen-)-Farbe sollte gar nicht gespeichert werden, in einem EDV System. Für (Augen)Farbe würde ich auch kurze String s verwenden, das sollte nicht zu langsam sein.

E-Mail, … da weiß ich auch nicht, mehrere Subdomains usw.

Ist es denn jetzt richtig oder (eher) nicht?

Wie Slater schon sagte : hier wäre der Tabellenaufbau der Datenbank interessant, denn irgendwie müssen die Daten ja darin gespeichert sein. Mit dem Package java.sql.* kannst du dir diese Daten in Java-Objekte packen die du dann wiederum in einem großen Sammelobjekt hältst (Bean-mäßig mit Standard-Gettern/-Settern). Fertig ist dies Kiste.
Dann noch ein bisschen “Interaktion” drum rum, also Vergleich (equals, compare), Datenmanipulation, “Aktivitäten” … viel ist es nicht und lässt sich mit guten Code-Generatoren sogar komplett automatisch erzeugen. Wirklich viel selbst schreiben ist bei sowas nicht nötig.

Nicht Calendar!

Man kann darüber streiten, was genau man da verwendet, aber: NICHT Calendar. Die Date/Time-API von Java < 8 rund um Calendar ist einfach “broken”. Verwende stattdessen die Date/Time-API von Java 8 - siehe Java SE 8 Date and Time

Ansonsten stimme ich den Vorrednern zu, erwähne aber noch, dass es “Puristen” gibt, die sowas postulieren wie “Ein Name ist ein Name und kein String” ( Ein Name ist ein Name und kein String | open knowledge ). D.h. die domenänenspezifische Bedeutung (siehe vorherige Antworten) eines Wertes wird explizit über seinen Typ codiert. (Oberflächlich betrachtet bedeutet das, dass sowas wie person.setName(otherPerson.getBirthPlace()); schon vom Compiler abgefangen wird). Ich stelle auch in Frage, ob man das (immer?) so machen sollte, aber wollte es mal erwähnt haben…

steht alles in der JDBC-API: du wählst in Java den Datentyp, der

  1. ohne Probleme aus einem Resultset ausgelesen werden kann (rs.get(nr))

  2. ohne Probleme bei einem Update-Befehl wieder zuruckgeschrieben werden kann (preparedStatement.set(nr)

alles andere führt zu blöden Konvertierereien, konvertier in der GUI wenn nötig.

ist ein bisschen Datenbank abhängig, aber normalerweise kein Problem

MySQL :: MySQL Connector/J Developer Guide :: 5.3 Java, JDBC and MySQL Types

jTDS native to JDBC data type mapping

JDBC - Data Types

String sollte in Ordnung sein, man könnte aber auch auf die Idee kommen long zu verwenden.
Wenn die Unterscheidung der Orts/Landes-Vorwahl vom Rest der Nummer wichtig ist kann man auch eine eigene Klasse dafür anlegen, in der die VOrwahlen und der Rest der Nummer getrennt dargestellt werden und inn einer toString() Methode wieder zusammengesetzt.

Wenn es eine einfache Farbe ist, kann man, wie bereits von meine Vorrednern geschrieben java.awt.Color benutzen, sollte aber so etwas wie: „blau-grau“ verwendet werden wollen, wäre ein String vielleicht einfacher. Kommt darauf an was du mit der Augenfarbe, außer sie zu speichern, sonst noch machen willst.

Wie bereits von Marco13 gesagt, benutze besser die Java 8 Bibliotheken, oder etwas eigenes, je nach deinem Ansprüchen.

MfG,
~Oneric

Nur, wenn man sich quälen will.

  1. Telefonnummern sind keine Zahlen (werden nie addiert oder subtrahiert, werden nie der Größe nach verglichen, etc.)

  2. Es gibt

+49 statt 0049 also das „+“ zeichen

(124) 3445 für die Vorwahl (also Klammern)

124/3445 für die Vorwahl (also Schrägstrich)

234234-221 für die Durchwahl (also einen Bindestrich)

User Input dahingehend zu verwursten und long daraus zu machen - keine gute Idee

^ Das, und: Telefonnummern fangen gerne mal mit einer “0” an. Ich will nicht wissen, wie oft schon versucht wurde, selbst vermeinlich “harmlose” Dinge wie eine Postleitzahl in einen int zu packen, und damit ganz Dresden zu verbannen…

Eine GUI-Klasse java.awt.Color für Augenfarbe ist auch eine richtig blöde Idee. Wüsste nicht, dass man Augenfarben jetzt im RGB-Schema oder den anderen möglichen angibt. Obwohl, sollte ich mal ausprobieren: „Schatz, deine 0000FF-Augen sind so schön!“ :kiss: Calendar für die Datenhaltung auch Overkill. Auch, wenn es schlecht ist (mutable etc.) in der vor Java-8-Zeit ist es ein java.util.Date. Wenn immutability wichtig ist, getter und setter ensprechend programmieren und ggf. intern als Long speichern. Zusammengefasst, nur das, mit dem man rechnet, sind Zahlen, alles andere Strings, Datum ist Datum, beschränkte Wertebereiche sind enums, strukturierte Daten sind eigene Klassen. Ist ja alles auch schon geschrieben worden (irgendwie).

Fuer Augenfarben kan man zB. eigene Enums definieren, oder als simplen String wenn sie nicht unbedingt einheitlich sein sollen.
Fuer das Geburtsdatum wuerde ich java.util.Date/JodaTime verwenden, die Date/Time API von Java 8 ist mir noch suspekt bzw. zu komplex.
Fuer Telefonnummer kann man eine eigene Klasse oder nur einen String nehmen, je nachdeem was man damit vorhat(Validerung, Umwandlung, etc.), Zahlen sind es auf keinen Fall.

Ok, ich widerspreche maki mal - das Java 8-time-Zeugs ist nicht wirklich komplex, zumindest nicht die Klasse, die Du benötigst: Nimm statt Calendar java.time.LocalDate, mehr brauchst Du nicht für ein Geburtsdatum. Selbst ich habe es geschafft, damit zurecht zu kommen.:wink: