Zugriff mittels getObject() oder this.object ?

Status
Nicht offen für weitere Antworten.

-frank

Bekanntes Mitglied
ich habe eine kleine designfrage zu folgendem beispiel-code:

Code:
class A {

    private Object field1;
    protected Object field2;

    public Object getField1() ..
    
    public Object getField2() ..

    void doSomething1() {
    ..
    System.out.println(" ... " + getField1());
    System.out.println(" ... " + this.field1);

    }
}

Class B extends A {
    void doSomething2() {
    ..
    System.out.println(" ... " + getField2());
    System.out.println(" ... " + this.field2);

    }
}

es geht um die zugriffe auf die felder. ich bin mir oft nicht sicher, ob ich mittels get() oder direkt auf die felder zugreifen soll. gibt es zb eine sicherheitsabfrage wie hier:

Code:
Object getField1() {
    if(isInitialized()) {
        return Field1;
    }
    else throw new Exception...
}

dann kann ich von fall zu fall entscheiden, ob ich die sicherheitsabfrage auch bei zugriffen innerhalb des objekts benötige oder nicht. bei mir ist es aber öfters so, dass es diese abfragen zunächst nicht gibt, aber diese schon kommen könnten (okay, eventuell sollte ich hier besser vorausplanen...).
oder zb folgende situation:

Code:
String getData() {
    return this.data;
}

wird zu:

Code:
String getData() {
    return this.data1 + ", " + data2;
}

hier wäre es natürlich angenehmer, wenn man im code überall die get()-Methode stehen hat statt eines direkten zugriffs. umgekehrt ist der direkte zugriff wohl schneller. (oder kann dies der compiler wegoptimieren? (wenn ja, nur innerhalb der klasse oder auch bei der abgeleiteten klasse?)

sollte man generell direkt zugreifen und nur, wo es nötig ist bzw. wahrscheinlich mal nötig sein wird, mittels get(), oder ist es durchaus auch üblich mal vorsichtshalber mittels get zuzugreifen? würdet ihr es bei der abgeleiteten klasse so sehen, dass die protected variable ein zeichen des programmierers, dass man direkt zugreifen kann/soll? (denn wenn der entwickler damit rechnen würde, dass das feld eventuell verschwindet bzw. sich irgendwie ändert, dann würde er dieses ja private machen und get() und public/protected set() anbieten.)

in fremden code sehe ich meistens direkte zugriffe. ist dies im normalfall bzw. zweifelsfall die bessere wahl? [/code]
 
S

SlaterB

Gast
ob schneller oder nicht ist irrelevant wenn es um logischen/ nachvollziehbaren Code geht,
(u.a.) deswegen benutzt man ja Java und nicht Assembler oder anderes kryptisches was sicherlich schneller wäre,

schneller wäre vielleicht auch in Java ein einzelnen Objekt mit 10.000 Exemplarvariablen,
aber die ganze Objektauftrennung ist ja (u.a.) eine Strukturierung für den Leser,

so für mehr erzählen habe ich gerade keine Lust mehr,
kommen sicher noch andere ;)
 

schalentier

Gesperrter Benutzer
Ich schliesse mich uneingeschraenkt meinem Vorposter an.

Nimm wann immer es geht die getter/setter-Methoden. Die Vorteile hast du ja bereits selber erkannt, den Nachteil mit der Geschwindigkeit kannst und solltest du einfach vergessen.

Falls deine Anwendung zu langsam wird, kannst du mittels eines Profilers die tatsaechlichen Bottlenecks finden und ausbessern. Aber ich denke, getter/setter-Aufrufe werden nicht bemerkenswert die Performance druecken...

Im uebrigen ist es tausend Mal besser, gut und angenehm lesbaren Code zu schreiben, der ein bisschen langsamer laeuft, dafuer aber funktioniert und wartbar ist, als auch noch das letzte Prozent Performance rauskitzeln zu wollen und dabei viele Codeconventions und einfache Mittel, lesbaren Code zu schreiben, zu vergessen (Genauso ist es im Deutschen auch, siehe den vorigen Satz. Ist viel drin, aber kaum lesbar ;-) ).
 

sparrow

Top Contributor
Ich befürchte das kann man gar nicht so genau verallgemeinern.

Bei mir sieht es in der Regel so aus, dass ich getter und setter nur verwende wenn die entsprechende Variable "von aussen" veränderbar sein soll.
Geht es ausschließlich darum Objekte von der selben Klasse aus zu verwenden benutze ich den direkten Zugriff und stelle dem ganzen ein this. voran, da fände ich getter/setter eher hinderlich und unübersichtlich.

Gruß
Sparrow
 

-frank

Bekanntes Mitglied
der minimale performance gewinn spielt meist natürlich keine rolle. da ist ein lesbarerer sicher mehr wert (in den meisten fällen). also da verstehe ich euch voll.
interessant finde ich aber, dass ihr anscheinend beide der meinung seid, dass get/set eindeutig lesbarer ist als der direkte zugriff. für mich ist dies nicht so eindeutig, da ich bei

Code:
...
Object obj = getObject();
..

auf den ersten blick nicht weiß, ob die get-Methode mehr macht als nur das objekt zurückzuliefern. bei

Code:
...
Object obj = this.object;
..

ist dies sofort ersichtlich.

aus den oben genannten gründen tendiere ich zur benutzung von getter/setter-methode auch innerhalb einer klasse. aber als lesbarer hätte ich eher den direkten zugriff gesehen. (--> zum selbst programmieren ist mir get() lieber, wenn ich in fremden code sehe, finde ich ein this.object eindeutiger, weil ich mir nicht die get()-methode ansehen muss)

würdet ihr dann so weit gehen private getter/setter methoden zu schreiben?
 

Wildcard

Top Contributor
Grundsätzlich getter/setter zu verwenden is Designtechnisch günstiger da neue Funktionaliät flexibler durch überschreiben der getter hinzugefügt werden kann. Das macht allerdings nur sinn bei zumindest 'friendly' gettern, für private getter sehe ich keine sonderliche Notwendigkeit (es sei denn hier ist zusätzliche Logik erforderlicht).
 
S

SlaterB

Gast
intern ist es zum Teil egal, ja, was sollte sonst getX() machen ;)

das ist hauptsächlich für extern gedacht,
aber auch für andere Logikteile in der eigenen Klasse oder gar in abgeleiteten Klassen,
wenn die Klasse so groß/ vielseitig wird, dass man schon von verschiedenen Teilen sprechen kann
(einer kümmert sich um die Verwaltung der Exemplarvariablen)

ob in diesem Fall die Klasse eh neustrukturiert werden sollte sei mal dahingestellt


wie gesagt ist eine abgeleitete Klasse meiner Meinung nach praktisch wie eine externe zu behandeln,
die Klassengrenze ist z.B. wegen Hervorhebung von Eclipse eine entscheidene Grenze beim Programmieren,
aber natürlich auch im konzeptionellen Sinne

-----

es geht aber auch andersrum,
wenn man reine Containerklassen für 10 unterschiedliche Variablen hat,
ohne jede weitere Funktionalität, ohne großen Transport sondern nur im Kontext von zwei/ drei Verarbeitungsklassen,
vielleicht gar nicht mal public deklariert/ interne Klasse,
dann kann man da sicher auch direkt drauf zugreifen,

nix für mich, mich persönlich würde allein schon die Schreibweise object.object stören,
auch this.x ist nicht so schön anzuschauen..,
allerdings benutzte ich dann Exemplarvariablen auch oft ganz ohne this oder getX(), sondern nur x ;)
 

-frank

Bekanntes Mitglied
hmm, okay, dann gilt also:
1. getter/Setter methoden sind prinzipiell praktisch, wenn man den code später verändert. direkten zugriff von "außen" vermeiden (aber das ist mir eh klar, mir gings u.a. nur um die frage, ob eine abgeleitete klasse als "außen" gilt). ausnahme: public static final und sowas.
2. private getter/setter methoden sind übertrieben bzw. nicht nötig, solange da nicht mehr funktionalität drin steckt oder man davon ausgeht, dass diese funktionalität in zukunft benötigt werden wird.

dann noch 2 fragen:
1. public/"friendly" getter/setter existieren bereits für den zugriff von außen, müssen also nicht extra geschrieben werden. dann fügt man schnell mal ne methode dazu wie zb toString(). um das objekt zu beschreiben, braucht man zugriff auf ein paar variablen. wenn ihr nicht mehr informationen habt: public getter verwenden oder direkten zugriff?

2. protected variablen oder private variablen plus protected getter/setter? zumindest du, SlaterB, bist eher für letztere variante wenn ich das richtig verstanden habe oder?
 
S

SlaterB

Gast
jo,
und wenn es die getter gibt, dann wäre es bei Problemen (NullPointerException) für mich nervig, nach Variable UND nach getter zu setzen,
deshalb da auch in toString lieber getter benutzen,


allerdings oft mehr Vorsatz als wirklich praktikabel ;)


nett ist auch zum Debuggen in einen getter
System.out.println(Aufruf durch, Wert = );
reinzuschreiben,
und vorallem ein setter ist dann viel leichter zu überwachen, als die 8 lokalen Stellen an denen die Exemplarvariable geändert wird
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Java Zugriff auf Netzwerklaufwerk Allgemeine Java-Themen 1
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
O Zugriff auf mySQL ohne JDBC Allgemeine Java-Themen 3
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
W Zugriff auf Objektvariablen vs. Übergabe Allgemeine Java-Themen 3
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
Tommy Nightmare HTTP Zugriff auf Internetseite im Loginbereich Allgemeine Java-Themen 5
H Zugriff auf PHP Allgemeine Java-Themen 4
B DB-Zugriff einer Webanwendung funktioniert nicht mit Java 7 Allgemeine Java-Themen 2
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
O JNA Zugriff auf Funktion aus DLL Allgemeine Java-Themen 0
O Zugriff auf Windows Zertifikatstore Allgemeine Java-Themen 2
M Kein Zugriff auf microSD Karten Allgemeine Java-Themen 4
T Zugriff auf Datenbank Allgemeine Java-Themen 1
J Zugriff auf IMAP GMail Konto scheitert. Allgemeine Java-Themen 2
P Frontend- Zugriff auf WS- Backend Allgemeine Java-Themen 0
U Zugriff auf Datei sperren Allgemeine Java-Themen 5
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
C Zugriff auf Event felder Allgemeine Java-Themen 0
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
F Zugriff Verweigert bei Kopieroperation? Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
S Dynamischer Zugriff Allgemeine Java-Themen 4
Minonos Einem Programm Zugriff auf bestimmte Ordner geben Allgemeine Java-Themen 5
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
V Zugriff auf den Objekterzeuger? Allgemeine Java-Themen 4
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16
B Zugriff auf eine HashMap Allgemeine Java-Themen 4
B JApplet Zugriff auf Local Storage des Browser? Allgemeine Java-Themen 2
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
M gleichzeitiger Zugriff auf eine Textdatei Allgemeine Java-Themen 6
D Eclipse Kein Zugriff auf Inhalt einer referenzierten .jar Allgemeine Java-Themen 5
B synchronisierter zugriff auf Objekt Allgemeine Java-Themen 6
nutellastulle Zugriff, Übergabe, Bearbeitung und Ausgabe von Jlist Allgemeine Java-Themen 6
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
J XML Element Zugriff Allgemeine Java-Themen 4
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
M Klassen Zugriff auf getMethode ohne Klasse zu erzeugen Allgemeine Java-Themen 6
A Input/Output Applet-Zugriff auf PHP-Schnittstelle (externer Server) Allgemeine Java-Themen 22
H Vererbung Abgeleitete Klassen und Zugriff Allgemeine Java-Themen 2
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
J Zugriff auf Poker-Client Fenster Allgemeine Java-Themen 14
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
S Zugriff auf innere Klasse Allgemeine Java-Themen 3
D Kein Zugriff auf WebService ausser localhost Allgemeine Java-Themen 4
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
J Zugriff auf Dateien auf einem shared Folder? Allgemeine Java-Themen 3
H Zugriff auf VBA in Java Allgemeine Java-Themen 2
Haave Audio Device Unavailable: Kein gleichzeitiger Zugriff auf Soundsystem möglich Allgemeine Java-Themen 7
G Letzter Zugriff auf Datei Allgemeine Java-Themen 5
C java.io.FileNotFoundException: (Zugriff verweigert) Allgemeine Java-Themen 14
O Zugriff auf Serielle Schnittstelle - Keine Ports gefunden. Allgemeine Java-Themen 8
C Webstart: Zugriff auf lokale Dateien? Allgemeine Java-Themen 2
X Zugriff auf ComboBoxen in Hauptklasse von zweiter Klasse aus Allgemeine Java-Themen 8
J Zugriff auf gemeinsame Funktionen Allgemeine Java-Themen 4
Airwolf89 Zugriff auf ArrayList<ArrayList> Allgemeine Java-Themen 3
Airwolf89 Zugriff auf Werte in ArrayList<ArrayList> Allgemeine Java-Themen 4
T Zugriff zwischen Klassen für repaint Allgemeine Java-Themen 7
N Zugriff auf eine Referenzvar. Allgemeine Java-Themen 3
S Zugriff auf Klasse Allgemeine Java-Themen 4
Meldanor Mehrdimensionale Arrays : Zugriff auf n-tes Array Allgemeine Java-Themen 5
E JNA:Zugriff auf Common-Block von Fortran bzw. Struct in C Allgemeine Java-Themen 2
T Zugriff auf Singleton verkürzen - Namespaces?? Allgemeine Java-Themen 20
L Zugriff auf ein Objekt mit mehreren Threads Allgemeine Java-Themen 11
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
S Zugriff auf einzelne Bildpunkte Allgemeine Java-Themen 3
D Referenzen weiterreichen vs. statischer Zugriff Allgemeine Java-Themen 3
V Zugriff auf Default-Package? Allgemeine Java-Themen 6
P RegeEx-Problem: Zugriff auf group Allgemeine Java-Themen 2
M Zugriff auf Parallel-Schnittstelle Allgemeine Java-Themen 2
B Zugriff mit einem Applet auf den Datenträger Allgemeine Java-Themen 11
S Innere Klasse: Zugriff auf äußere Variable Allgemeine Java-Themen 5
I Zugriff auf Daten Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
D Zugriff auf Windows Dienste Allgemeine Java-Themen 7
G Zugriff auf Memberclasses einer geladenen Class-Datei Allgemeine Java-Themen 2
I Gleichzeitiger zugriff auf ein Long über Threads Allgemeine Java-Themen 2
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
J Kein Zugriff auf Klassen im Default Package Allgemeine Java-Themen 8
M Paralleler Zugriff auf statische Methode Allgemeine Java-Themen 5
S Zugriff auf unterschiedliche JREs Allgemeine Java-Themen 7
M "Unzulässiger Zugriff auf einen Speicherbereich" Allgemeine Java-Themen 7
A Zugriff auf Parallelport nur über Eclipse nicht über .jar ! Allgemeine Java-Themen 12
G Zugriff auf ein sama share Allgemeine Java-Themen 8
J Java zugriff auf Exchange Server Allgemeine Java-Themen 10
D eclipse: Zugriff auf Ordner per code Allgemeine Java-Themen 4
O Konkurrierender Zugriff auf Log-Datei mit Log4J Allgemeine Java-Themen 11
Caracasa [Threads] Gleichzeitiger Zugriff auf eine LinkedList Allgemeine Java-Themen 9
L Zugriff auf Objekt das sich in einer Liste befindet Allgemeine Java-Themen 2
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
J Zugriff auf Map in anderer Klasse Allgemeine Java-Themen 2
J Endlosschleife durch wechselseitigen Zugriff zweier Klassen? Allgemeine Java-Themen 2
F Zugriff auf lokalen Rechner wer weiss Rat ? Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben