Erste Schritte Übergabe von Klassen

cppvoid

Neues Mitglied
Ich programmiere schon eine Weile in C++ und versuche mir nun Java beizubringen. Im Moment lese ich das Buch Effective Java 2nd Edition. Um das was ich gelesen habe zu verstehen, habe ich ein kleines Programm geschrieben. Nun bin ich etwas verwirrt, denn ich habe gelernt, dass das übergeben von Kopien(defensive copying) seht teuer ist. Deswegen habe ich versucht, so viel wie möglich immutable zu machen. Ich würde gerne wissen, ob mein Code kritischen Anfängerfehler enthält. Eine andere Frage ist, wie ich am besten damit umgehe, wenn sich der Name einer Person doch einmal ändernt? Ich dachte mir die einzige Möglichkeit wäre ein neues Objekt zu erstellen und das alte Objekt mit dem neuen auszutauschen, oder sollte Person nicht immutable sein?

Java:
//PhoneNumber.class
package cppvoid.addressbook.data;

import java.io.Serializable;

public final class PhoneNumber implements Serializable {
    private final String number;

    public PhoneNumber(String number) {
        this.number = number;
    }

    public String getNumber() {
        return number;
    }

    @Override
    public String toString() {
        return number;
    }
}
//Person.class
package cppvoid.addressbook.data;

import java.io.Serializable;
import java.util.*;
import java.time.*;

public final class Person implements Serializable{
    private final String firstName;
    private final String lastName;
    private final LocalDate dateOfBirth;
    private LinkedList<PhoneNumber> phoneNumbers = new LinkedList<>();

    public Person(String firstName, String lastName, LocalDate dateOfBirth) {
        this.firstName = firstName;
        this.lastName = lastName;

        if(dateOfBirth.isAfter(LocalDate.now())) {
            throw new IllegalArgumentException("date is not in the past");
        }

        this.dateOfBirth = dateOfBirth;
    }

    public Person(Person p) {
        this.firstName = p.firstName;
        this.lastName = p.lastName;
        this.dateOfBirth = p.dateOfBirth;
        this.phoneNumbers = new LinkedList<>(p.phoneNumbers);
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public LocalDate getDateOfBirth() {
        return dateOfBirth;
    }

    public int getAge() {
        Period p = Period.between(dateOfBirth, LocalDate.now());

        return p.getYears();
    }

    public void addPhoneNumber(PhoneNumber number) {
        if(number == null) {
            throw new NullPointerException("PhoneNumber is null");
        }
        phoneNumbers.add(number);
    }

    public LinkedList<PhoneNumber> getPhoneNumbers() {
        return new LinkedList<>(phoneNumbers);
    }
}
//PersonsFile.class
import cppvoid.addressbook.data.Person;

import java.util.*;
import java.io.*;

public final class PersonsFile {
    public static final boolean save(String filePath, final LinkedList<Person> persons) {
        try(FileOutputStream fileStream = new FileOutputStream(filePath);
            ObjectOutputStream objectStream = new ObjectOutputStream(fileStream)) {

            objectStream.writeObject(persons);
            return true;
        }
        catch(IOException ex) {
            ex.printStackTrace();
            return false;
        }
    }

    public static final LinkedList<Person> load(String filePath) {
        LinkedList<Person> persons = null;

        File file = new File(filePath);
        if(!file.exists()) {
            return new LinkedList<>();
        }

        try(FileInputStream fileStream = new FileInputStream(filePath);
            ObjectInputStream objectStream = new ObjectInputStream(fileStream)) {

            persons = (LinkedList<Person>) objectStream.readObject();
        }
        catch(IOException | ClassNotFoundException ex) {
            ex.printStackTrace();
        }

        if(persons == null) {
            persons = new LinkedList<>();
        }

        return persons;
    }
}
//AddressBook.class
package cppvoid.addressbook;

import cppvoid.addressbook.data.Person;
import cppvoid.addressbook.io.PersonsFile;

import java.util.*;

public final class AdressBook implements Iterable<Person> {
    private final String filePath;
    private LinkedList<Person> persons;

    public AdressBook(String filePath) {
        this.filePath = filePath;

        persons = PersonsFile.load(filePath);
    }

    public void addPerson(Person p) {
        if(p == null) {
            throw new NullPointerException("Person is null");
        }
        persons.add(new Person(p));
    }

    public boolean save() {
        return PersonsFile.save(filePath, persons);
    }

    @Override
    public Iterator<Person> iterator() {
        return persons.iterator();
    }
}

Danke für eure Zeit.
 

InfectedBytes

Top Contributor
Wenn der Name veränderbar sein sollte, dann sollte er natürlich mutable sein. Immer neue Objekte erzeugen und sie überall zu ersetzen ist sehr umständlich und teuer, vor allem wenn man bedenkt dass man auch einfach das Feld mutable machen kann.

Außerdem wird in Java zwar jede Variable per Value übergeben, aber bei Objekten heißt das nur, dass die Referenz kopiert wird und nicht das ganze Objekte
 

stg

Top Contributor
ich habe gelernt, dass das übergeben von Kopien(defensive copying) seht teuer ist. Deswegen habe ich versucht, so viel wie möglich immutable zu machen.

Den Zusammenhang verstehe ich nicht.

Java:
persons.add(new Person(p));
Gerade dann, wenn Person immutable ist, macht das für mich keinen Sinn. Füge doch direkt p der Liste hinzu!

oder sollte Person nicht immutable sein?

Ob etwas immutable sein sollte, oder nicht, hängt immer davon ab, wo und wie du die Instanzen später einmal verwenden willst. Das ist in erster Linie eine Design-Entscheidung, die getroffen wird. Man muss nur wissen, ob etwas immutable ist oder nicht und dann dementsprechend damit arbeiten. Bei Personen würde ich das wenigstens fragwürdig finden. Wie du selbst sagst ändert sich dann doch mal der Name. Wenn du zum Ändernd des Namens eine neue Person anlegen musst, dann musst du diese auch in allen Relationen, in denen die Person auftaucht, neu verdrahten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
L Klassen Parameter Übergabe Java Basics - Anfänger-Themen 12
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
K Übergabe von Werten (zweidimensionales Array) aus einer Methode an zweidimensionales Array in main() Java Basics - Anfänger-Themen 3
S Übergabe von Arrays an Methoden Java Basics - Anfänger-Themen 20
D Methode mit Übergabe double und Rückgabe String Java Basics - Anfänger-Themen 2
L Methoden Übergabe von Parameter Java Basics - Anfänger-Themen 3
K Java Problem mit Übergabe von argumenten Java Basics - Anfänger-Themen 3
J Übergabe von Parametern an andere Methoden Java Basics - Anfänger-Themen 5
D Probleme mit der Übergabe einer BorderPane Java Basics - Anfänger-Themen 2
R Methoden Übergabe von einer Methodenvariable Java Basics - Anfänger-Themen 3
M Übergabe von Werten Java Basics - Anfänger-Themen 10
arjoopy Kapselung Übergabe von Objekten aus ArrayList Java Basics - Anfänger-Themen 4
C Methoden Objekte und Methode und Übergabe Java Basics - Anfänger-Themen 4
O Übergabe in eine andere Klasse Java Basics - Anfänger-Themen 3
M Übergabe / Rückgabe Java Basics - Anfänger-Themen 6
S Kapselung Objekt bei Übergabe an Konstruktor nicht initalisiert Java Basics - Anfänger-Themen 3
T Problem bei Übergabe von Variablen Java Basics - Anfänger-Themen 1
fLooojava Probleme bei der Übergabe einer Variable Java Basics - Anfänger-Themen 14
R Vererbung Übergabe von Variablen der Superklasse an Subklasse mit "extends" Java Basics - Anfänger-Themen 5
S OOP Übergabe eines Objektes? Java Basics - Anfänger-Themen 1
fLooojava OOP Übergabe/Output in Textfield Java Basics - Anfänger-Themen 4
U Übergabe von Objekten Java Basics - Anfänger-Themen 0
J ArrayList toString() Übergabe Fehler Java Basics - Anfänger-Themen 2
S Übergabe Java Basics - Anfänger-Themen 14
S Klassen Array: Übergabe von Klasse zur Main Java Basics - Anfänger-Themen 8
A NullPointerException bei Übergabe eines Array Java Basics - Anfänger-Themen 8
feardorcha Methodenaufruf Übergabe- und Rückgabewert Java Basics - Anfänger-Themen 5
D Klassen Problem - Übergabe an Konstruktor von Superklasse Java Basics - Anfänger-Themen 2
D Objekt Übergabe Java Basics - Anfänger-Themen 12
M Array Übergabe Java Basics - Anfänger-Themen 17
W Übergabe Stringzeilen von serieller Schnittstelle in andere Klasse Java Basics - Anfänger-Themen 3
B Übergabe Dateiname (String) an andere Klasse Java Basics - Anfänger-Themen 4
P Methoden Übergabe von Werten Java Basics - Anfänger-Themen 7
F Variablen Übergabe von eingelesenen Variablen in neue Klasse Java Basics - Anfänger-Themen 15
M Fragen zu Methoden (void/return), Übergabe von Parametern Java Basics - Anfänger-Themen 3
A Übergabe von Variablen zu Paintmethode Java Basics - Anfänger-Themen 2
N Array Übergabe Java Basics - Anfänger-Themen 9
A OOP Übergabe eines Wertes an den enum Konstruktor Java Basics - Anfänger-Themen 12
O Übergabe von Variablen Java Basics - Anfänger-Themen 9
Darth Simple Übergabe eines Strings an eine Methode Java Basics - Anfänger-Themen 3
A Frage zur Übergabe von Strings Java Basics - Anfänger-Themen 9
N Übergabe problem Java Basics - Anfänger-Themen 6
M Übergabe von VM Argumenten Java Basics - Anfänger-Themen 4
J Übergabe einer ArrayList an mehrere Threads Java Basics - Anfänger-Themen 3
E Übergabe von werten aus einem JDialog Java Basics - Anfänger-Themen 4
J Übergabe eines Arrays als Parameter Java Basics - Anfänger-Themen 2
S Übergabe von Frame-Objekt - kritisch? Java Basics - Anfänger-Themen 7
L JTabbedPane, richtige Übergabe von Tabs Java Basics - Anfänger-Themen 18
Z BigInteger Methoden und deren Übergabe Java Basics - Anfänger-Themen 3
K Übergabe einer im EventListener definierte variablen Java Basics - Anfänger-Themen 2
M Übergabe von Variablen in eine Klasse Java Basics - Anfänger-Themen 13
G Wieso ist eine String-Übergabe keine by-reference-Zuweisung? Java Basics - Anfänger-Themen 7
M Problem bei der Übergabe von Werten Java Basics - Anfänger-Themen 7
G Übergabe von Parametern an JSP Java Basics - Anfänger-Themen 3
S Veränderung von Protected Daten durch Übergabe? Java Basics - Anfänger-Themen 3
K Übergabe der Variable für Farbe Java Basics - Anfänger-Themen 6
G List<.> nach Übergabe vergleichen? Java Basics - Anfänger-Themen 3
G Übergabe Variablen von Servlet zu JSP? Java Basics - Anfänger-Themen 4
R Beiß mir die Zähne aus an der Request-Parameter-Übergabe! Java Basics - Anfänger-Themen 10
lin Übergabe an JPanel-Klasse Java Basics - Anfänger-Themen 3
S NullPointerException bei Array-Übergabe Java Basics - Anfänger-Themen 3
D Übergabe von Variablen Java Basics - Anfänger-Themen 11
W Variabeln Übergabe Java Basics - Anfänger-Themen 14
F Großes Problem: Vector-Übergabe Java Basics - Anfänger-Themen 7
F Übergabe Vaterframe mit this und Fehlermeldung. Java Basics - Anfänger-Themen 2
D Fragen zu Methoden und Übergabe von Werten Java Basics - Anfänger-Themen 4
G Übergabe von Variablenwerten zwischen Methoden Java Basics - Anfänger-Themen 4
D Problem bei Übergabe von Werten an eine Methode Java Basics - Anfänger-Themen 2
H Übergabe eines Wertes an eine Bean --> Bean leer Java Basics - Anfänger-Themen 6
T Array-Übergabe Java Basics - Anfänger-Themen 7
M Windows Pfad-Übergabe.. Java Basics - Anfänger-Themen 6
S String mit Konstruktor (per Übergabe) initialisieren Java Basics - Anfänger-Themen 10
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben