Erste Schritte Übergabe von Klassen

C

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

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

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
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
A Problem mit set.Text und übergabe Java Basics - Anfänger-Themen 2
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
Furtano OOP Memento Pattern | übergabe einer Kopie des Arrays Java Basics - Anfänger-Themen 0
U Übergabe von Objekten Java Basics - Anfänger-Themen 0
J ArrayList toString() Übergabe Fehler Java Basics - Anfänger-Themen 2
J Problem bei Param.übergabe und dem erstellen von JButtons Java Basics - Anfänger-Themen 4
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
M problem mit string übergabe an klasse Java Basics - Anfänger-Themen 10
A übergabe wert in andere klasse Java Basics - Anfänger-Themen 8
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
A konstruktor übergabe fehler Java Basics - Anfänger-Themen 8
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
G JFileChooser übergabe an Directory Java Basics - Anfänger-Themen 4
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
M [SOLVED]parameter übergabe an objekte Java Basics - Anfänger-Themen 2
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
Z übergabe von string[] an konstruktoren oder methoden 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
W übergabe des aktuellen wertes in andere Klasse Java Basics - Anfänger-Themen 3
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
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
B Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Anzeige

Neue Themen


Oben