Frage zu this und get.

Status
Nicht offen für weitere Antworten.

siebeck

Mitglied
Habe folgendes Problem:

class Person {
String name;
int geburtsdatum;

void drucken() {
System.out.println("Name: "+name);
System.out.println("Geburtsdatum: "+geburtsdatum);
}

Person(String n, int gd) {
(*) name=n;
geburtsdatum=gd;
System.out.println("Person: "+this.name);
}
}

Offensichtlich ist es egal ob ich bei * this.name=n oder name=n schreibt.
Meine Frage dann, wozu hat this sonst eine Bedeutung, wenn es hier überflüssig ist?

2.Frage:
Im Buch steht noch folgendes:
public String getName() {return name;}

Ist diese Methode dazu da, wenn von außerhalb auf den Namen zugegriffen werden soll? In der Klasse wurde der name durch name=n bereits zugewiesen und mit System.out.println ausgegeben.
 

Lim_Dul

Top Contributor
this hat den Vorteil, dass man explizit darauf hinweist, dass es sich um eine Membervariable handelt. Ist praktisch, wenn man keinen Editor mit Syntaxhighlighting hat, der einem das sowieso anzeigen.

Es gibt aber auch Fälle, wo this zwingend notwendig ist:

Code:
public class Foo {
  private String bar;

  public Foo(String bar) {
    this.bar = bar;
  }
}

Um hier im Konstruktor zwischen dem übergebenen Parameter und der Membervariablen zu unterscheiden, braucht man this. Allerdings sollte man solche Konstrukte weitesgehend vermeiden, also dass this wirklich nötig ist.

Zur get-Methode.

Richtig, in der Klasse wurde der Wert bereits zugewiesen.
Nur möchte man meistens nicht, dass die Klasse wie ein Schwarzes Loch alle Informationen einsackt, aber nichts wieder herausgibt. Von außerhalb möchte man gerne manchmal wissen, wie der Name der Person ist. Dafür ist diese Methode da.
 

padde479

Bekanntes Mitglied
Code:
class Person {
    String name;    // Name der Person
    int    bday;    // Geburtsdatum der Person

    void drucken() {
        System.out.println("Name: " + name);
        System.out.println("Geburtsdatum: " + bday);
    }

    public Person(String name, int bday) {
        this.name = name;
        this.bday = bday;
    }

Das Schlüsselwort this ist dazu da, um ein Objekt der eigenen Klasse zu beschreiben.
Offensichtlich ist es egal ob ich bei * this.name=n oder name=n schreibt.
Das stimmt soweit, da bei Dir der Übergabeparameter nicht mit dem Objekt der Klasse Person übereinstimmt. Wie Du aber an meinem Beispiel sehen kannst, bekommt der Konstruktor auch einen Parameter name. Wenn man jetzt mit dem Schlüsselwort this arbeitet, wird der Parameter dem Objekt der Klasse zugeordnet.
 

foobar

Top Contributor
this wird dazu verwendet um zwischen gleichnamogen Variablen und Membern zu unterscheiden:

Code:
Person(String n, int gd) 
{
this.name=name;
geburtsdatum=gd;
System.out.println("Person: "+this.name);
}

Hier wird der Member name durch den Parameter name verdeckt., daher muß man ein this davor stellen um dem Member den Wert des Parameters zuzuweisen.

Mit this kann man ausserdem von einer inneren Klasse auf die äußere Klasse zugreifen:
Code:
public class Outer
{
   private String outer;

 ....
  private class Inner
 {
    public Inner()
   {
     System.out.println("outer " + Outer.this.outer);
   }
 }
}
 
Hi,
wenn du ein this vor eine Instanzvariable schreibst, dann spricht man davon dass du diese Qualifizierst.
Du benötigst dieses this an vielen Stellen zwar nicht, aber es gehört zum guten Codestil. Schließlich verwendest du auch mehrere Zeilen für deine Java-Programm, du könntest es aber auch alles in eine schreiben.

Diese Qualifizierung sagt dir einfach, dass du dich gerade auf eine Instanzvariable beziehst. Hättest du zum Beispiel noch eine statische Variable, dann kannst du die nicht ohne weiteres als solche am Namen erkennen. Ausserdem kannst du die somit von lokalen Variablen unterscheiden:
Code:
int x;
int y;

public void doFoo(int x) {

  int y = this.y // ohne this könntest du nicht auf das y der klasse zugreifen

  y--;
  this.x = y * x; // und nochmal
}

Was getter und setter angeht, so Kapseln sie einfach den Zugriff auf Variablen. Variablen solltest du immer möglichst privat lassen. Ein direkter Zugriff ist nie nötig. Wenn du Methoden wie getX() und setX(... x) verwendest, kannst du in diesen Methoden sehr leicht von einer Variable abstrahieren. Zudem kannst du für das Setzen und Lesen der Variablen unterschiedliche Sichtbarkeiten zu lassen. Sind deine Variablen privat und du schreibst nur eine getX(), so wäre die eine Möglichkeit eine Variable nur lesbar zu machen.
Bei den Settern kannst du leicht die Gültigkeit prüfen. Sagen wir du hast ein byte, dass etwas in Prozent speichert. Würdest du nun -105 deiner Variable zu weisen, wäre ein gültiges byte, aber nicht unbedingt ein für dich sinnvoller Wert.
Auch bei den gettern hast du noch weitere Vorteile. Hast du z.B. eine Abhängigkeit, kann diese leicht aktuell berechnet werden. Sagen wir du hast eine Mehrwertsteuer und einen Bruttobetrag, dann kannst du den Betrag der Mehrwersteuer entweder immer dann berechnen, wenn der Bruttobetrag verändert wird und den in einer eigenen Variable speichern (sehr umständlich) oder du berechnest ihn halt im dazu gehörigen Get. Hier rechnest du erst den Wert aus und gibst ihn dann zurück.

Gruß Der Unwissende

PS Schlechte Beispiele im Buch. Mann sollte sich auch im eigenen Programm an das halten was man sagt!
 
Leroy42 hat gesagt.:
Der_Unwissende hat gesagt.:
aber es gehört zum guten Codestil.

Wer behauptet denn sowas?

Unter anderem Allan Vermeulen in "The Elements of Java Style". Natürlich gibt es auch noch die Tatsache, dass Eclipse die fehlende Qualifizierung als Warning ausgeben kann. Wäre es einfach nur Unsinn hätte sich keiner die Mühe gemacht dies aufzunehmen.

Leroy42 hat gesagt.:
Hast du schon mal ein Programm gesehen, in dem dieser gute Codestil
konsequent eingehalten wird?

Mehrere, finde es auch wenig problematisch mit dem zu arbeiten. Ehrlich gesagt verstehe ich da nicht, was da so grauenhaft dran sein sollte? Ich meine ob da jetzt noch ein this mehr steht oder nicht... Klar, die Zeilen werden wieder so lang und es kostet ja auch vertvolle ms das this zu tippen, aber ich habe auch eine Menge dummer Fehler gesehen, wo das this weggelassen wurde und bei einer Erweiterung des Codes ein Argument mit (dummerweise) gleichen Namen in eine Methode kam. Nun ja, wenn jmd. zu blöd zu refactoren ist, ist das dumm. Aber ganz ehrlich, gleich ein this schützt wenigstens vor solchen Leuten.
 

Leroy42

Top Contributor
Der_Unwissende hat gesagt.:
Ich meine ob da jetzt noch ein this mehr steht oder nicht... Klar, die Zeilen werden wieder so lang und es kostet ja auch vertvolle ms das this zu tippen

Aus dieser hohlen Gasse wollte ich ja sowieso nicht kommen. Wenn's mir darum ginge,
könnte ich ja gleich die Abschaffung von gettern und settern propagieren und alle Instanzvariablen
public fordern, um Unmengen nutzlosen Codes einzusparen :cool:

Der_Unwissende hat gesagt.:
Menge dummer Fehler gesehen, wo das this weggelassen wurde und bei einer Erweiterung des Codes ein Argument mit (dummerweise) gleichen Namen in eine Methode kam. Nun ja, wenn jmd. zu blöd zu refactoren ist, ist das dumm.

Wenn jemand zu blöd ist, eine Methode um ein Argument zu erweitern, ohne sich mal den Quelltext
dieser Methode anzutun, um zu erkennen, ob sein neuer Parameter da drin schon vorkommt,
ist entweder er zu blöd, oder der Autor der Methode, der eine 100-Zeilen-Methode verzapft hat.

Der_Unwissende hat gesagt.:
Aber ganz ehrlich, gleich ein this schützt wenigstens vor solchen Leuten.

Naja, nicht vor solchen Leuten, sondern solche Leute; um genau zu sein :cool:

Auf der anderen Seite ist aber doch sowieso alles, das kein this. vorgesetzt bekommt
entweder ein Parameter oder eine lokale Variable (das nachzuschauen sollte niemanden überfordern) ,
oder ein Member der Klassenhierarchie (egal ob vererbt oder nicht) oder einer Implementation.


Was also bringen dann diese unnützen this. Vornamen;
ich rede nicht von den notwendigen.

Auf jeden Fall keinen Informationsgewinn.
 

foobar

Top Contributor
Ich hab mal eine zeitlang bei jedem Methodenaufruf und bei jedem Member this davor geschrieben, aber irgendwann war mir das zu viel Tipperei.
 

Lim_Dul

Top Contributor
Sinnvoll ist es höchestens um in längeren Methoden kenntlich zu machen, wenn man einer Membervariablen was zuweist.
Andererseits ist das aber häufig ein Zeichen von schlecht strukturiertem Code.

Und in Zeiten, wo eine IDE alles farblich hinterlegt hält sich der Informationsgewinn in Grenzen.
 

SnooP

Top Contributor
ich tippe häufig this. - weil mir eclipse dann die entsprechenden methoden anzeigt und ich die simpel auswählen kann ;) - gerade bei größeren klassen mit entsprechender vererbungstiefe fehlt mir häufig die übersicht, wie genau die methoden jetzt hießen ;)

und die Zuweisung bei set-Methoden oder im Konstruktor im Stil: this.name = name; find ich sehr leserlich, weil man damit sofort versteht was gemeint ist - beide Parameter heißen gleich und sollen auch das gleiche sein...
 

Leroy42

Top Contributor
SnooP hat gesagt.:
ich tippe häufig this. - weil mir eclipse dann die entsprechenden methoden anzeigt und ich die simpel auswählen kann ;)
Probier's mal ohne this. -- einfach nur mit CTRL-+ :cool:


SnooP hat gesagt.:
this.name = name; find ich sehr leserlich, weil man damit sofort versteht was gemeint ist - beide Parameter heißen gleich und sollen auch das gleiche sein...

Hier finde ich es auch hilfreich/notwendig um in der Javadoc der Methode dann den richtigen
Namen als Parameternaman sehen zu können.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Frage zum Quellcode - Zusammhänge und Ablauf. Java Basics - Anfänger-Themen 2
D Erste Schritte Frage eines absoluten Anfängers Java Basics - Anfänger-Themen 3
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
H Frage zum Array Java Basics - Anfänger-Themen 17
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
B Fachliche Frage bei Rechnungen Java Basics - Anfänger-Themen 16
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben