Referenz auf Objekte und deren Inhalte

MiMa

Top Contributor
In der Vergangenheit habe ich immer Methoden programmiert, bei denen ich Werte mitgegeben habe und falls diese ein Ergebnis erzeugten, wurde es mit Return zurück gegeben.

Code:
// Variablendeklaration
dateiObjekt.dateiPfadNameEndung
dateiObjekt.dateiEndung
dateiObjekt.InhaltIstLeer

// Mit Rückgabe
dateiObjekt.dateiEndung = sucheDateiEndung(dateiObjekt)

// Methode
public static String sucheDateiEndung(Datei dateiObjekt) {
String dateiEndung = sucheDateiendung(dateiObjekt.getDateiNameEndung);
return dateiEndung
}

Im Speicher werden Objekte ja Referenziert und es wird demnach auf eine Speicheradresse gezeigt die in der Methode mitgeben wird.
Wäre es denn eine schlechte Idee wenn ich nun nun eine Methode programmiere und direkt mit Get und Set Methoden arbeite anstatt einen Werte zurück zu geben?
Code:
// Variablendeklaration
dateiObjekt.dateiPfadNameEndung
dateiObjekt.dateiEndung
dateiObjekt.InhaltIstLeer

// Ohne Rückgabe
fuelleWerteInObjekt(dateiObjekt);
LOG.info("Dateiendung" + dateiObjekt.getEndung);
LOG.info("Inhalt ist Leer" + dateiObjekt.isInhaltIstLeer);

// Methode
public static void fuelleWerteInObjekt(Datei dateiObjekt) {
// sucht die Dateiendung
dateiObjekt.setEndung(sucheDateiEndung(dateiObjekt.getDatei));
// Inhalt ist leer
dateiObbjekt.setInhaltIstLeer = true;
}

Wenn die Methode ohne Rückgabe aufgerufen wird, und die Referenz mit gesendet wird, dann kann auf das dateiObjekt zugegriffen werden.
Somit kann man auch auf die Instanzvariablen verändern und zugreifen.
Nachdem die Methode beendet wird, dann geht die Verbindung zu dem dateiObjekt verloren aber da es eine Referenz war, kann man auf die in der Methode erzeugten Werte dennoch zugreifen??!!
Die Programmierung wäre aber dann nicht mehr nach dem BackBox prinzip.

Letzte Möglichkeit wäre dass dateiObjekt komplett mir den geänderten Werten zurück zu geben.
 
Zuletzt bearbeitet:

MiMa

Top Contributor
Danke, das würde auch einiges erleichtern.
Ist schon ein Unterschied ob man OOP oder imperativ programmiert.
 
K

kneitzel

Gast
Sicher, das du das meinst? Ich würde das jetzt nicht vermuten. Du meinst evtl. prozedurale, nicht objektorientierte, Entwicklung?

Da hat man einen Überblick über die Paradigmen ... mit Unterteilung Imperative und Deklarative Programmierung als erste Unterteilung. Bei dem Deklarativen hat man dann Funktionale und Logische Programmierung.... Und Deine Aussagen aus #1 deuten nicht auf Funktionale Programmierung hin...
 

mihe7

Top Contributor
Um hierauf auch noch einzugehen:
Wenn die Methode ohne Rückgabe aufgerufen wird, und die Referenz mit gesendet wird, dann kann auf das dateiObjekt zugegriffen werden.
Somit kann man auch auf die Instanzvariablen verändern und zugreifen.
Nachdem die Methode beendet wird, dann geht die Verbindung zu dem dateiObjekt verloren aber da es eine Referenz war, kann man auf die in der Methode erzeugten Werte dennoch zugreifen??!!
Die Programmierung wäre aber dann nicht mehr nach dem BackBox prinzip.

Letzte Möglichkeit wäre dass dateiObjekt komplett mir den geänderten Werten zurück zu geben.
Möglich ist beides. Du kannst ein Objekt um Auskunft bitten oder aber anweisen, etwas "für Dich" zu tun. Letzteres kennt man unter der Phrase "Tell, don't ask". Hintergrund ist, dass man verhindert, Entscheidungen basierend auf den Ergebnissen zu treffen, die Objekte liefern. Diese Vorgehensweise wäre typisch für das prozedurale Paradigma.

In Java kannst Du problemlos Objekte erzeugen und zurückgeben, um die Freigabe des Speichers kümmert sich der Garbage Collector.
 

MiMa

Top Contributor
Du meinst evtl. prozedurale, nicht objektorientierte, Entwicklung?
Ja genau, das meinte ich.

Da gibt es noch etwas, was ich gerne wissen würde.
Um mehrere Dateien ab zu arbeiten wird läuft das ganze in einer Schleife.
Für Dateien die leer, defekt oder geschützt sind werden direkt verschoben.
Dafür habe ich einen if - else Block, der jeweils mit einem continue endet wenn die jeweilige option ausgeführt wurde.
Die Continue Anweisung bricht dann an dieser stelle ab und macht dann in der Schleife weiter was sehr gut funktioniert.
Da dieser if - else Block größer werden könnte würde ich diesen gerne in eine eigene Methode "aussortieren(..)" auslagern.
Allerdings weis ich nicht ob das funktioniert?
Break bricht eine Switch-Anweisung ab und Continue bricht die aktuell Position ab und macht dann in der Schleife weiter.
Ist es denn überhaupt möglich in einer weiteren Methode ab zu brechen und mit dem nächsten Eintrag in der Schleife weiter zu machen?

Danke
Mi
 
K

kneitzel

Gast
Also du kannst in der Methode nicht direkt eine Schleife abbrechen. Es gibt da aber mehrere Lösungsmöglichkeiten:
a) Rückgabewert. Wenn das Ergebnis nicht passt, dann brichst Du halt ab.
b) Exception: Wenn Du eine Exception wirfst, dann kannst Du diese auch außerhalb einer Schleife erst abfangen. Aber hier beachten: Exceptions sind "exceptional", also nicht erwartete Ausnahmen. Aber Du erwartest ja explizit, dass einzelne Dateien korrupt sind. Daher würde ich das als unzureichend ansehen.

Also du kannst sehr wohl etwas machen wie
Code:
if (isFileCorrupt(fileInfo))
    continue; // oder break oder was auch immer du wünscht :)
 

MiMa

Top Contributor
Aktuell sieht es so aus.
Java:
 // Schleife für die Verarbeitung der Dateien: ANFANG
        for (File eintrag : dateiListe) {
            Datei datei = new Datei(eintrag);

            // Inhaltsprüfungen für Ausnahme-Dateien
            Datei.ausnahmen(datei);
          
            // Verschieben von leeren, defekten und geschützten Dateien
            if (datei.getGroesseBytes() == 0) {
                // Die Datei wird ins Löschverzeichnis verschoben wenn die größe nicht 0 ist
                LOG.info("Die Dateigröße ist " + datei.getGroesseBytes()
                        + " (Bytes) und enthält daher keine brauchbaren Informationen.");
                Datei.umbenennenVerschieben(datei.getDateiQuelle(),
                        new File(einstellungen.getVerzeichnisLoeschen() + "/" + datei.getNameEndung()), einstellungen.isLeerzeichen());
                continue;
            } else if (datei.isInhaltLeer()) {
                LOG.info("Die Quelldatei besitzt keinen Inhalt und wird in das Verzeichnis ohne Inhalt verschoben");
                Datei.umbenennenVerschieben(datei.getDateiQuelle(),
                        new File(einstellungen.getVerzeichnisOhneInhalt() + "/" + datei.getNameEndung()),
                        einstellungen.isLeerzeichen());
                continue;
            } else if (!datei.isLesbar()) {
                LOG.info("Die Quelldatei ist nicht lesbar und wird in das Löschverzeichnis verschoben");
                Datei.umbenennenVerschieben(datei.getDateiQuelle(),
                        new File(einstellungen.getVerzeichnisLoeschen() + "/" + datei.getNameEndung()),
                        einstellungen.isLeerzeichen());
                continue;
            } else if (!datei.isBeschreibbar()) {
                LOG.info("Die Quelldatei ist nicht beschreibbar und wird in das Geschützte verzeichnis verschoben");
                Datei.umbenennenVerschieben(datei.getDateiQuelle(),
                        new File(einstellungen.getVerzeichnisGeschuetzt() + "/" + datei.getNameEndung()),
                        einstellungen.isLeerzeichen());
                continue;
            } // if-else

            // Datei auf Inhalt prüfen
            ....
 
K

kneitzel

Gast
Du kannst natürlich hier die continue weglassen und dafür am Ende noch ein else hinzu fügen.

Und du hast da ja eigentlich schon, dass Du da jeweils eine Methode aufrufst, so man von dem LOG und dem continue absieht.
 

MiMa

Top Contributor
Ja ich weis die Loganweisungen blähen ganz schön auf aber nachdem alles erfolgreich getestet wurde, kommen die auch wieder raus.
Das ist bei dem Atomisieren bei der Datenbankentwicklung.
Erst hat man einen sehr sehr langen Code, dann lagert man entsprechende aus und hat es manchmal schwer zu erkennen ob es nun gut ist oder nicht. :)
 
K

kneitzel

Gast
Naja, das Logging könnte man ggf. in die Methode verschieben. Generell würde ich das drin lassen, nur den loglevel kann man ja anpassen. Sowas ist als Tracing oder Debugging durchaus nett. Da haben wir bei jeder Methode im Kopf eigentlich ein Log, dass es aufgerufen wurde (mit Übersicht der Parameter) und oft auch eine Zusammenfassung der Ergebnisse.

Dann kann man gezielt Tracing einschalten so gewünscht. Wenn man keinen Zugriff auf Produktionssysteme hat, dann ist das eine sehr gute Methode um nachzuvollziehen, wieso etwas schief läuft...

Aber das nur am Rande. Generell halte ich die nicht für störend.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
G 2 Objekte der selben Klasse zusammenfügen und alte Referenz Allgemeine Java-Themen 19
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
kodela Übergabe einer Referenz Allgemeine Java-Themen 20
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
S OOP this-Referenz als Konstruktor-Übergabe Allgemeine Java-Themen 8
M neues Objekt speichern, nicht Referenz Allgemeine Java-Themen 10
Y POI auf eine Referenz (Datei/Internetseite) anwenden Allgemeine Java-Themen 9
B Speicherverbrauch Objekt-Referenz Allgemeine Java-Themen 11
D Referenz einer Funktion aus einer anonymen Klasse? Allgemeine Java-Themen 3
P Threads ohne Referenz & der Garbage Collector Allgemeine Java-Themen 2
K Als Rückgabewert ode call by referenz was ist sauberer? Allgemeine Java-Themen 12
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
T Interface-Referenz Allgemeine Java-Themen 2
K ArrayList Referenz Allgemeine Java-Themen 8
MQue this- Referenz Allgemeine Java-Themen 4
G referenz von variablen Allgemeine Java-Themen 9
T Referenz und GC? Allgemeine Java-Themen 16
T JNI Referenz auf Variable in Java? Allgemeine Java-Themen 2
MQue Datei- referenz schließen Allgemeine Java-Themen 5
S Referenz auf Funktion? Allgemeine Java-Themen 16
P call by value/referenz Allgemeine Java-Themen 4
S Stream ohne Referenz kopieren ? Allgemeine Java-Themen 4
G Referenz und Garbagecollector Allgemeine Java-Themen 4
D Map: Referenz oder Int-ID als key speichern? Allgemeine Java-Themen 11
M Stil-Frage: this-Referenz Allgemeine Java-Themen 38
B wird Vektor als Referenz übergeben? Allgemeine Java-Themen 5
V Übergabe per Referenz. Allgemeine Java-Themen 5
G Eine C/C++ Referenz in einem Java Object speichern Allgemeine Java-Themen 5
G Referenz auf Variable! Allgemeine Java-Themen 3
F array als referenz/werteparameter übergeben? Allgemeine Java-Themen 2
M Referenz wird nicht überschrieben? Allgemeine Java-Themen 2
C GC: Referenz entfernen Allgemeine Java-Themen 6
K Referenz löschen Allgemeine Java-Themen 3
T Exception im Constructor -> null-Referenz zurückgeben Allgemeine Java-Themen 6
schegga_B javax.crypto - Cipher Objekte - Sevice Provider matching? Allgemeine Java-Themen 1
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
W Objekte reproduzieren Allgemeine Java-Themen 2
W Objekte per Reflexion instanziieren Allgemeine Java-Themen 7
W Unittest - Objekte simulieren Allgemeine Java-Themen 7
T OOP Objekte mit Erweiterung Initialisieren Allgemeine Java-Themen 6
O Erste Schritte Objekte als Datenelemente Allgemeine Java-Themen 14
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
F Objekte erzeugen Allgemeine Java-Themen 1
E Threads ThreadPoolExecutor remove mit callable Objekte Allgemeine Java-Themen 3
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
E OOP Objekte und Methoden Allgemeine Java-Themen 1
@SupressWarnings() Umgebungsvariable Objekte "gekoppelt" Allgemeine Java-Themen 6
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
C Objekte in Array List speichern? Allgemeine Java-Themen 1
OnDemand Objekte speichern Allgemeine Java-Themen 8
B Objekte anhand von Properties file Allgemeine Java-Themen 41
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
F FileOutput/Input Objekte Allgemeine Java-Themen 6
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
J unterschiedliche Objekte, selbe getter und setter Allgemeine Java-Themen 15
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M Instanzierte Objekte in XML Dokument speichern Allgemeine Java-Themen 3
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
H Objekte Serialisiert speichern Allgemeine Java-Themen 10
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
L Input/Output Textdatei in Objekte überführen? Allgemeine Java-Themen 4
R Input/Output Objekte speichern ohne überschreiben Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
M Java Objekte in XML mit JAXB Allgemeine Java-Themen 9
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
H COM-Objekte/ AktiveX Objekte Allgemeine Java-Themen 4
C Script für Website mit Objekte Ausblenden Allgemeine Java-Themen 3
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben