String-Methoden, Datentyp 'char', Parameter-Validierung
1. Erste String-Methoden
In Java werden Text-Inhalte als Objekte der Klasse String
verwaltet.
Das hat u.a. den Vorteil, dass Methoden für vielfältige Funktionalitäten bereitgestellt werden können.
Wir sehen uns einige dieser Methoden an, die für Parameter-Validierung sehr wertvoll sind.
Die Nutzung erfolgt durch Aufruf an String-Objekten (als Variable, Literale, Methoden-Rückgabewerte oder Ausdrücke).
Für Demonstrationszwecke sind String-Literale besonders plakativ – die Länge eines Textes erhält man (als Zeichenzahl) z.B. mit
int txtLen = "Hallo Leute".length();
Alternativ kann man eine Variable (hier txt
) nutzen:
String txt = "Hallo Leute"; int txtLen = txt.length();
Die Variable txtLen
enthält danach in beiden Fällen Wert 11
.
Weitere String-Methoden (hier immer an Literalen aufgerufen):
-
"".isEmpty()
… lieferttrue
, da der Text Länge 0 hat -
"Hallo".isEmpty()
… liefertfalse
da der Text Länge >0 (Wert 5) hat -
" \t \n".isBlank()
… lieferttrue
, da der Text nur inhaltsleere Zeichen enthält (space
,tab
,space
,newline
) -
"Hallo".startsWith("Ha")
lieferttrue
-
"Hallo".endsWith("lo")
lieferttrue
-
"Hallo".contains("all")
lieferttrue
-
Mit
String txt = "es ist 14:00".toUpperCase()
hattxt
den Wert"ES IST 14:00"
-
Analog liefert
"haLLO".toLowerCase()
den Text"hallo"
-
"Hausaufgabe".indexOf("au")
liefert 1 (Position Anfang des ersten "au", beginnend bei0
). Wenn nicht enthalten, wird-1
zurückgeliefert! -
"Hausaufgabe".lastIndexOf("au")
liefert 4 (Position Anfang des letzten "au", sonst analog) -
SEHR wichtig: Strings werden (wie alle anderen Objekttypen auch) mit
txt1.equals(txt2)
auf Gleichheit geprüft, auf Ungleichheit durch Vorstellen von'!'
(bedeutetNOT
).
Beispiele:if (txt.equals("AUDI")) {System.out.println("txt enthält 'AUDI'");}
oder:if ( ! txt.equals("gruen")) {System.out.println("txt enthält NICHT 'gruen'");}
.Hintergrund: Objekte werden als Referenzen (Adressen) auf das jeweilige Objekt im RAM gehandhabt und
txt1 == txt2
vergleicht daher die Adressen auf Gleichheit. Das ist aber die allerstrengste Form der Gleichheit, nämlich Identität (txt1
undtxt2
zeigen auf die SELBE Adresse). Bei Vergleich von 2 Texten geht es aber nicht darum, dass sie als Objekt ident sind, sondern ob sie die selbe Zeichenfolge darstellen – das können problemlos 2 unterschiedliche String-Objekte mit dem gleichen Textinhalt sein.Java verwaltet aber alle Texte, die IRGENDWO (auch im BlueJ-Methodenaufruf-Formular) als Literal (also z.B. "Hallo") entstanden sind auf eine Weise, dass für ein neuerliches "Hallo" einfach eine Referenz auf das bereits existierende "Hallo" zurückgeliefert wird. Das geht deswegen, weil in Java Strings 'immutable', also unveränderlich sind. Bei Bedarf wird immer ein neues String-Objekt erzeugt".
in Arbeit ...
2. Einzelzeichen-Datentyp char
Vergleichsoperatoren wie Zahlen: 'a' < 'b'
liefert true
, char ch = 'a'; ch == 'b'
liefert false
.
Das geht, weil char
-Werte eigentlich Zahlen sind.
Man kann mit Einzelzeichen auch ein bisschen rechnen:
-
'a' + 1
liefert'b'
-
'b' - 'a'
liefert1
-
'z' - 'a'
liefert25
-
'a'
-'A'
liefert32
(25) -
'z'
-'Z'
liefert32
(25) -
sogar
'ö'
-'Ö'
liefert32
(gleiches für ä, ü=
3. Parameter-Validierung (z.B. im Setter)
Ein einfaches Beispiel:
public class Tree
{
private String species;
private int height;
private boolean conifer;
public Tree() {
setSpecies("Maple");
setHeight(24);
setConifer(false);
}
public Tree(String species, int height, boolean conifer) {
setSpecies(species);
setHeight(height);
setConifer(conifer);
}
public void setSpecies(String species) {
// only as a preview how to do validity checks for strings
if (species.isBlank()) { // later we should check for null first!!
System.out.println("ERR in setSpecies(..) - no real content: '" + species
+ "', value remains '" + this.species + "'");
} else {
this.species = species;
}
}
public void setHeight(int height) {
if (height <= 0 || height > 200) {
System.out.println("ERR in setHeight(..) - invalid (>0 .. 200): " + height
+ ", value remains " + this.height);
} else {
this.height = height;
}
}
public void setConifer(boolean conifer) {
this.conifer = conifer; // often no validity check possible for boolean value
}
public String getSpecies() {
return this.species;
}
public int getHeight() {
return this.height;
}
public boolean getConifer() { // for booleans allowed to write 'isConifer()' instead!
return conifer;
}
public void printInfo() {
System.out.println("===== Tree =====");
System.out.println(" Species: " + species); // or this.species or getSpecies()
System.out.println(" Height: " + height); // or this.height or this.getHeight()
System.out.println(" is Conifer: " + getConifer()); // or conifer or this.getConifer()
}
}