Java Grundlagen – Block2 (Java Basics) – Tag 2
Ich nehme derzeit an einer Akademie zum Java Fullstack Software Engineer teil. In den kommenden Wochen möchte ich hier meine Mitschrift, so gut es geht, aufzeichnen und mitteilen. Hier ist das, was ich vom zweiten Tag in Block 2 gelernt und behalten habe:
Datentypen und Ihre Längen: https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html
Aufgabe: Wir wollen die Verarbeitung aus dem Monolithen (EVA) separieren:
File/New Project/Maven/archetype-quickstart, Projektame:0202-kreisrechner-utility, GroupID: de.firma, Pom.xml nach 11 wechseln
Wir erstellen in der Struktur de.firma das Package "Appl" und refaktorieren unsere Datei App.java dorthin:
Ich habe sie im falschen Verzeichnis ertellt. Per drag und drop, kann man die Datei verschieben. Es wird dann gefragt, ob wir refactoren wollen. Ja, das tun wir:
Wir erstellen eine neue Klasse Kreisrechner:
package de.firma.util;public final class Kreisrechner {
public static double flaeche(double radius) { return Math.PI * Math.pow(radius, 2); } public static double umfang(double radius) { return 2 * Math.PI * radius; }
}
In der der App-Klasse steht jetzt folgendes:
package de.firma.appl;import de.firma.util.Kreisrechner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/**
Kreisrechner
fläche = Pi * Radius * Radius
Umfang = 2 * Pi * Radius
*/
public class App {
public static void main(String[] args) {// Vorbereitung für die Eingabe via Tastatur // InputStreamReader isr = new InputStreamReader(System.in); //Verknüpfung von Tastatur mit Systembus // BufferedReader br = new BufferedReader(isr); //Verknüpfung vom Systembus mit dem Speicher BufferedReader br = new BufferedReader(new InputStreamReader((System.in))); boolean fehler = false; while (fehler == false) { System.out.println("Kreisrechner"); System.out.println("---------------------------"); System.out.println("Bitte Radius eingeben: "); try {
//Eingabe
double radius = Double.parseDouble(br.readLine());
//Verarbeitung
// double flaeche = radius * radius * 3.14159265;
// double umfang = 2 * radius * 3.14159265;
double flaeche = Kreisrechner.flaeche(radius);
double umfang = Kreisrechner.umfang(radius);
//Ausgabe
System.out.printf("Radius %f \n", radius);
System.out.printf("Fläche %f \n", flaeche);
System.out.printf("Umfang %f \n", umfang);
} catch (IOException e) {
e.printStackTrace();
System.err.println("Irgendwas hat die Verbindung gekappt.");
fehler = true;
} //Fehlermeldung, wenn z.B. das Kabel durchschnitten wird
catch (NumberFormatException e) {
System.err.println("Sach ma, kannste nicht ne vernünftige Zahl eingeben du Trottel?");
fehler = true;
}
}
}
}
Das hat funktioniert.
--------------------------------------
Übungsaufgabe Block2_Ueb01:
- Neues Projekt:
- Kehrwertrechner (1/x)
- z.B. Eingabe: 2, Ausgabe=0.5
- *) Kehrwertrechner -> Utility-Klasse
- **) Formatierte Ausgabe mit max. 3 Nchkommstellen
- ***) Wiederhole die Eingabe so lange bis der Benutzer abbrechen möchte
package de.firma; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;/**
Umkehrrechner.
Dieses Programm gibt den Umkehrweert der Eingabe zurück.
*/
public class App {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
boolean fehler = false;
while (fehler == false) {
try {
//Eingabe
System.out.println("Hallo lieber User, bitte gib den Wert ein, den ich umkehren soll:");
double wert = Double.parseDouble(br.readLine());//Verarbeitung double uwert = Uwertrechner.umkehren(wert); //Ausgabe System.out.printf("Der Umkehrwert ist: %6.3f", uwert); System.out.println(); System.out.println("Bitte gib 'q' ein, um abzubrechen"); } catch (IOException e) { e.printStackTrace(); System.err.println("Irgendwas hat die Verbindung gekappt."); fehler = true; } //Fehlermeldung, wenn z.B. das Kabel durchschnitten wird catch (NumberFormatException e) { System.err.println("Es wurde keine Zahl eingegeben und damit wird das Programm beendet!"); fehler = true; } }
}
}
package de.firma;public class Uwertrechner {
public static double umkehren (double wert) {
return 1 / wert;
}
}
Oder noch schöner:
App.java:
App.java: package de.firma; import de.firma.util.Abfrage; import de.firma.util.Uwertrechner;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
Umkehrrechner.
Dieses Programm gibt den Umkehrweert der Eingabe zurück.
*/
public class App {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
boolean fehler = false;
while (fehler == false) {//Eingabe double wert=Abfrage.wert(); //Verarbeitung double uwert = Uwertrechner.umkehren(wert); //Ausgabe System.out.printf("Der Umkehrwert ist: %6.3f", uwert); System.out.println(); fehler = Abfrage.ausstieg(); }
}
}
Uwertrechner.java
package de.firma.util;public class Uwertrechner {
public static double umkehren (double wert) {
return 1 / wert;
}
}
Abfrage.java:
package de.firma.util;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Abfrage {
public static boolean ausstieg() {
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
boolean aus = false;
System.out.println("Wenn du aufhören willst, gib bitte ein 'q' ein!");
String weiter = null;
try {
weiter = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if (weiter.equals("q")) {
aus = true;
}
return aus;
}public static double wert() { BufferedReader br = new BufferedReader(new InputStreamReader((System.in))); System.out.println("Hallo lieber User, bitte gib den Wert ein, den ich umkehren soll:"); double wert = 0; try { wert = Double.parseDouble(br.readLine()); } catch (IOException e) { e.printStackTrace(); System.err.println("Irgendwas hat die Verbindung gekappt."); } //Fehlermeldung, wenn z.B. das Kabel durchschnitten wird catch (NumberFormatException e) { System.err.println("Es wurde keine Zahl eingegeben und damit wird das Programm beendet!"); } return wert; }
}
Ein Vergleich von einem Objekt (String) mit einem Charakter geht in die Hose. Es sind zwei verschiedene Speicherstellen und deren Inhalt dürfte nicht identisch sein.
Dafür gibt es bei String die Methode "equals":
-------------------------
Vergleiche
Wir erstellen ein neues Package in firt maven projekt "compare":
Mit der Klasse Compare:
Alpha und beta sind nur deswegen gleich, weil sie gerade frisch erstellt wurden:
Obj1 ist ungleich obj2
Fazit: primitive Literale kann man mit == vergleichen, Objekte sollte man mit equals vergleichen.
Casting Beispiele (Achtung Java in Versionen vor 8 erzeugen beim Teilen von Integer falsche Werte):
---------------------------------------------------
Datenklassen
Wir erstellen Datenklassen (de.firma.model)
(Model -> Datenklassen)
Neue Klasse: Person
Das Problem daran ist, dass jeder von außen die Daten verändern kann. Z.B. den Puls.
Daher stellen wir es auf private und kapseln die Daten.
Mit Getter und Setter Methoden, kann ich Zugriff gewähren
Wir klicken auf Code/generate/Getter
Und wiederholen das für die Setter. Das Ergebnis sieht so aus:
Wenn man Logs schreiben will, ist es sinnvoll die von der Klasse Object geerbte ToString-Methode zu überschreiben:
Objekt-Verantwortlichkeit/Sichtbarkeit:
Klassenarten
- Applikationsklassen
- Sie beinhalten eine Methode: public static void main (Strin [] args)
- Sie haben keine weiteren Methoden
- Sie haben keine weiteren Eigenschaften
- Hilfsklassen (Utility-Klassen)
- Sie haben in der Regel wenige Eigenschaften (Daten/Werte)
- Static Methoden -> Klassenmethoden (sie sind kursiv geschrieben)
- Datenklassen
- Sie haben viele Eigenschaften
- Sie haben Konstruktoren
- Sie haben Getter und Setter Methoden
- Sie haben ggf. Busines Logik
——————
Disclaimer
Alles was ich mitschrieb und verstanden habe ist ohne Gewähr.
Besten Dank an unseren
Trainer: Hans-Joachim Blanke [email protected]
Mehr dazu im nächsten Blog von mir.
Gruß, Achim Mertens