Lernziele
Zentrale Konzepte in diesem Kapitel: Mit Bibliotjeksklassen umgehen, Dokumentaion lesen, Dokumentation schreiben
Java-Konstrukte in diesem Kapitel: String, Random, Hashmap, Hashset, Iterator, static, final, Autoboxing, Wrapperklassen
6.1 Die Dokumentation der Bibliotheksklassen
Konzept
Die Standardklassenbibliothek von Java enthält viele Klassen, die sehr nützlich sind. Es ist wichtig zu wissen, wie man die Bibliothek benutzen kann.
6.2 Die Klassendokumentation lesen
Konzept
Die Dokumentation der Java-Standardbibliothek zeigt Informationen über alle Klassen in der Bibliothek. Die Benutzung dieser Dokumentation ist unerlässlich für einen vernünftigen Gebrauch der Bibliotheksklassen.
6.2.1 Schnittstellen versus Implemenierungen
Konzept
Die Schnittstelle einer Klasse beschreibt, was eine Klasse leistet und wie sie benutzt werden kann, ohne dass ihre Implementierung sichtbar wird.
Sie werden feststellen, dass die Dokumentation unterschiedliche Informationen liefert. Sie enthält neben anderen Dingen:
- den Name der Klasse
- eine allgemeine Beschreibung des Zwecks der Klasse
- eine Liste der Konstruktoren und Methoden der Klasse
- die Parameter und ergebnistypen für jeden Konstruktor und jede Methode
- eine Beschreibung des Zwecks jedes Konstruktors und jeder Methode
Diese Informationen werden zusammengefasst als die Schnittstelle der Klasse bezeichnet. Vorsicht, die Schnittstelle zeigt nicht den Quelltext, der die Klasse implementiert. Wenn die Schnittstelle gut beschrieben ist, dann braucht ein Programmierer den Quelltext der Klasse nicht zu sehen, um die Klasse zu benutzen.
Konzept
Der komplette Quelltext, der eine Klasse definiert, wird als die Implementierung dieser Klasse bezeichnet.
6.2.2 Zeichenketten auf Gleichheit prüfen
Wichtig hier, nicht == verwenden sondern mit .equals() arbeiten.
6.3 Die Klasse Random
Würfeln-Beispiel:
import java.util.Random;
....
// zwischen 1 und 6
public void wuerfeln(){
Random generator = new Random();
int wert = generator.nextInt(6)+1; // nextInt() gibt nur zahlen von 0...5 (Grenzwert)
System.out.println(wert);
}
6.4 Benutzung von Map-Klassen für Abbildungen
6.4.1 Das Konzept einer Map
Konzept
Eine Map ist eine Sammlung, die Schlüsselwert-Paare als Einträge enthält. Ein Wert kann ausgelesen werden, indem ein Schlüssel angegeben wird. (in C# Key Value)
6.4.2 Die Benutzung einer Hashmap
Hashmap ist eine spezifische Implementierung einer Map. Die wichtigsten Methoden einer HashMap sind put (hinzufügen) und get (liefert das Element zurück)
HashMap<String, String> kontakte = new HashMap<>():
kontakte.put("Hans Berg", "+41 77 777 77 77");
kontakte.put("Barbara Brabra", "+41 77 777 77 78");
//
String telefonNr = konatke.get("Hans Berg");
Übung: Wie überprüfen Sie wie viele Einträge in einer Abbildung vorhanden sind?
Lösung: Gleich wie bei der ArrayList, mit der size()-Methode
Übung: Legen Sie eine Klasse MapTester an. Verwenden Sie in diesem Projekt eine HashMap, um eine Kontaktliste zu implementieren. Implementieren Sie zwei Methodenin dieser Klasse:
public void nummerEintragen(String name, String nummer)
und
public String nummerSuchen(String name)
import java.util.Hashmap;
public class MapTester{
private Hashmap<String,String> telefonbuch = new HashMap<>();
public MapTester(){
telefonbuch.put("Hans Muster", "+41 78 787 78 78");
telefonbuch.put("Lolly Muster", "+41 79 789 78 78");
}
public void nummerEintragen(String name, String nummer){
telefonbuch.put(name,nummer);
}
public String nummerSuchen(String name){
telefonbuch.get(name);
}
}
Übung: Was passiert, wenn Sie bei einer solchen Abbildung einen Eintrag mit einem Schlüssel vornehmen, der bereits eingetragen ist?
Der Eintrag mit dem Schlüssel wird überschrieben.
Übung: Was passiert, wenn Sie bei einer solchen Abbildung zwei Einträge mit demselben Wert, aber mit verschiedenen Schlüssel vornehmen?
Beide Einträge bleiben in der Abbildung. Die Schlüssel wird verwendet um die Einträge zu unterscheiden.
Übung: Wie prüfen Sie, ob ein gegebener Schlüssel bereits in einer Abbildung eingetragen ist?
mit containsKey(“”) -> liefert true oder false zurück.
Übung: Was passiert, wenn Sie einen Wert suchen und der Schlüssel in der Abbildung nicht existiert?
es wird ein null-Wert zurück gegeben
Übung: Wie geben Sie alle Schlüssel aus, die aktuell in einer Abbildung gespeichert sind?
mit keySet() erhalten wir ein Set<k> zurück.
6.5 Der Umgang mit Mengen
Konzept
Eine Menge (Set) ist eine Sammlung in der jedes Element nur maximal einmal enthalten ist. Die Elemente einer Menge haben keine spezifische Ordnung.
Die Java-Bibliothek bietet verschiedene Varianten von Mengen (set), die durch unterschiedliche Klassen implementiert sind. Wir werden im Folgenden ein HashSet benutzen
Übung: Was sind die Gemeinsamkeiten und die Unterschiede zwischen einem HashSet und einer ArrayList? Notes HashSet ist ein spezieller Fall eines Set und ArrayList ein spezieller Fall einer List
Gemeinsamkeiten:
– Beide enthalten eine Sammlung von Objekten
– mittels add kann man Objekte hinzufügen
– mittels remove kann man Objekte entfernen
– mittels size können wir die Grösse abfragen
– beide bieten eine Methode iterator , um pber alle Elemente interieren zu können.
Unterschiede:
– In Hashset kann kedes Objekt nur einmal in der Menge vorkommen ( weil es sich bei der Menge um ein Set handelt). In einer ArrayList kann ein Objekt mehrfach vorkommen.
– Eine ArrayList ist geordnet. Ein Hashset ist nicht geordnet.
6.6 Zeichenketten zerlegen
Die Methode split kann einen String in getrennte Substrings aufteilen und diese in einem String-Array zurückliefern. Der Parameter der Methode split definiert, an welcher Art von Zeichen der ORiginal-String zerlegt werden soll.
Übung: Die Methode split ist mächtiger, als sie in diesem Beispiel auf den ersten Blick aussieht. Wie können Sie exakt festlegen, wie ein String zerlegt werden soll?
man kann regulära Ausdrücke verwenden, um zu definieren, wie ein String aufgeteilt sein sollte.
Übung: Wie würden Sie die Methode split aufrufen, wenn sie einen String an Leerzeichen oder Tabulatorenzeichen zerlegen wollen? Wie können Sie einen String zerlegen, in dem die Wörter durch Doppelpunkte : getrennt sind?
String[] woerter = s.split("[ \t]");
String[] woerter = s.split(":");
Übung: Worin unterscheidet sich das Ergebnis, wenn die Wörter statt in einem HAshSet in einer ArrayList zurückgeliefert werden?
Die Verwendung von HashSet garantiert, dass es keine doppelten Elemente gibt, aber die Reiehenfolge der Wörter wird nicht beibehalten.
Übung: Was passiert wenn mehr als ein Leerzeichen zwischen zwei Wörtern steht (beispielsweise zwei oder drei Leerzeichen)? Gibt es ein Problem?
Es werden leere String erzeugt, was wahrscheinlich nicht beabsichtigt war. Um dies zu beheben, können wir wie folgt Abhilfe schaffen:
String[] woerter = s.Split(“[ \t]+”);
Übung: Erzeugen Sie eine Klasse namens SortierenTest. Erzeugen Sie in dieser Klasse eine MEthode, die ein Array von int-Werten als Parameter entgegennimmt und die Elemente sortiert (kleinstes Element zuerst) auf der Konsole ausgibt.
public class SortierenTest{
public void werte Sortieren(int[] werte){
Arrays.sort(wert);
for(int wert: werte){
System.out.println(wert + " ");
}
}
}
6.7 Autoboxing und Wrapper-Klassen
Wrapper-Klassen: Für jeden primitiven Typ ( int, boolean, char etc.) gibt es eine korrespondierende Wrapper-Klasse, die den zugeordneten primitiven Typ repräsentiert, aber ein echter ObjektTyp ist.
Die Wrapper-Klasse fpr int ist bspw. Integer.
Interger iwrap = new Integer(ix);
So kan iwrap in einer Sammlung von Typ ArrayList<Integer> gepseichert werden. Jedoch wird das Speichern von Primitiven Typen durch ein Sprachkonstrukt erleichtert: “Autoboxing”
Konzept
Autoboxing wird automatisch durchgeführt, wenn der Wert eines primitiven Typs in einem Kontext verwendet wird, in dem ein Wrappertyp erwartet wird.
Notes; Die inverse Operation ( das Unboxing) wird ebenfalls automatisch ausgeführt.
private ArrayList<Integer> notenListe;
....
public void speichereNoteInListe(int note){
// int wert wird in notenListe gespeichert -> // Autoboxing
// int wird zu Integer (Wrapping)
notenListe.add(note);
}
6.8 Die Klassendokumentation schreiben
Konzept
Die Dokumentation einer Klasse sollte genau die Informationen bieten, die andere Programmierer benötigen, um die Klasse ohne einen Blick auf ihre Implementierung benutzen zu können.
Die Elemente einer Klassendokumentation:
- Den Klassennamen
- einen Kommentar, der den allgemeinen Zweck und die Eigenschaften der Klasse beschreibt
- eine Versionsnummer
- den oder die Autorenamen
- eine Dokumentation für jeden Kosntruktor und jede Methode
Die Dokumentation jedess Konstruktors und jeder Methode sollte enthalten
- den Namen der Methode
- den Ergbnistyp
- die Namen und Typen der Parameter
- eine Beschreibung des Zwecks und er Arbeitsweise der Methode
- eine Beschreibung jedes Parameters
- eine Beschreibung des Ergebnisses
Javadoc wird im Quelltext wie folgt generiert:
/**
* Dies ist ein javadoc Kommentar
*
* Folgende Schlüsselwörter können enthalten sein
* @version
* @author
* @param
* @return
*/
6.9 Öffentliche und private Eigenschaften
Konzept
Zugriffsmodifikatoren definieren die Sichtbarkeit eines Datenfelds, eines Konstruktors oder einer Methode. Öffentliche (public) Elemente sind sowohl innerhalb der definierenden Klasse zugreifbar als auch von anderen Klassen aus; private (private) Elemente sind ausschliesslich innerhalb der definierenden Klasse zugreifbar.
6.10 Das Geheimnisprinzip
Konzept
Das Geheimnisprinzip besagt, dass die internen Details der Implementierung einer Klasse vor anderen Klassen verborgen sein sollten. Dies unterstütz eine bessere Modularisierung von Anwendungen.
6.11 Klassenvariablen und Konstanten
Konzept
Auch Klassen können Datenfelder haben. Diese werden Klassenvariablen oder auch statische Variablen genannt. Von einer Klassenvariablen existiert immer nur genau eine Kopie, unabhängig von der Anzahl der erzeugten Instanzen
Mit dem Schlüsselwort static werden in Java Klassenvariablen definiert. Klassenvariablen sind Datenfelder, die in der Klasse selbst, nicht in den Objekten gespeichert. Klassenvariablen werden oft dann eingesetzt, wenn ein Wert für alle Instanzen einer Klasse gleich sein soll.
public Class Ball
{
private static final int GRAVITATION = 3;
}
// Aufruf
Ball.GRAVITATION
Konstanten
Konstanten sind ähnlich wie Variablen, können aber ihren Wert während der Ausführung einer Anwendung nicht mehr ändern. (final)
Wichitg:Konstanzen müssen bei Ihrer Deklaration auch unmittelbar initialisiert werden. (Siehe Code Gravitation)
6.12 Klassenmethoden (static)
public static int gibAnzahlErzeugterInstanzen()
{
}
Zusammenfassung der Konzepte
- Java-Bibliotheken von Java enthält viele Klassenm die sehr nützlich sind. Es ist wichtig zu wissen, wie man die Bibliothek benutzen kann
- Dokumentation einer Bibliothel zeigt Informationen über alle Klassen in der Bibliothek. Die Benutzung dieser Dokumentation ist unerlässlihc für einen vernüftigen Gebrauch der Bibliotheksklassen
- Schnittstelle einer Klasse beschreibt, was eine Klasse leistet und wie sie benutzt werden kann, ohne dass ihre Implementierung sichtbar wird.
- Implementierung, der komplette Quelltext, der eine Klasse definiert, wird als Implementierung der Klasse bezeichnet.
- Unveränderlich – Ein Objekt wird als unveränderlich bezeichnet, wenn sein Inhalt oder Zustand nicht mehr geändert werden kann, nachdem es erzeugt wurde. String ist ein Beispiel für eine Klasse, die unveränderlihc eObjekte definiert.
- Map ist eine Sammlung, die Schlüssel-Wert Paare als Einträge enthält. Ein wert kann ausgelesen werden, indem ein Schlüssel angegeben wird.
- Set ist eine Sammlung, in der jedes Element nur maximale einaml enthalten ist. Die Elemente einer Menge haben keine spezifische Ordnung.
- Autoboxing wird automatisch durchgeführt, wenn der Wert eines primitiven Typs in einem Kontext verwendet wird, in dem ein Wrappertyp erwartet wird.
- Die Dokumentation einer Klasse sollte genau die Informationen bieten, die andere Programmierer benötigen, um die Klasse ohne einen Blick auf ihre Implementierung benutzen zu können.
- Zugriffsmodifikatoren definieren die Sichtbarkeit eines Datenfelds, eines Konstruktors oder einer Methode. Öffentliche (public) Elemente sind sowohl innerhalb der definierenden Klasse zugreifbar als auch von anderen Klassen aus; private (private) Elemente sind ausschliesslich innerhalb der definierenden Klasse zugreifbar.
- Auch Klassen können Datenfelder haben. Diese werden Klassenvariablen oder auch statische Variablen genannt. Von einer Klassenvariablen existiert immer nur genau eine Kopie, unabhängig von der Anzahl der erzeugten Instanzen
- Das Geheimnisprinzip besagt, dass die internen Details der Implementierung einer Klasse vor anderen Klassen verborgen sein sollten. Dies unterstütz eine bessere Modularisierung von Anwendungen.
Kommentare