2012-03-28 4 views
1

Iam ein Java-Anfänger und ich möchte fragen, was ist das Für und Wider dazu:Unterschied zwischen myClassInstance.property und myClassInsance.getProperty()?

Wenn ich eine Klasse machen und ich werde nicht meine eigenen Getter und Setter schreiben kann ich nur Eigenschaften meiner Klasse erhalten und setzen wie:

myClassInstance.name = "Jones" 
myClassInstance.job = "Manager" 

System.out.println(myClassInstance.name); 
System.out.println(myClassInstance.job); 

Warum besser, wenn ich machen Getter und Setter und wie dies zu tun:

myClassInstance.setName("Jones"); 
myClassInstance.setJob("Manager"); 

System.out.println(myClassInstance.getName()); 
System.out.println(myClassInstance.getJob()); 
+0

Wenn Sie die Eigenschaft-Stil ohne Getters und Setter mögen, werfen Sie einen Blick auf ** groovy **, da es diese für Sie generiert. Wenn Sie eine saubere Code-Stil/Regel haben, ist die Verkapselung Sache in der Realität kein Problem, wie alle dynamischen Sprachen zeigen. Aber das ist natürlich eine Frage des Geschmacks. – luukes

Antwort

3

Diese Frage zu einer der grundlegenden Prinzipien der OO-Design bezogen werden: Encapsulation!

Accessoren (auch als Getter und Setter genannt) sind Methoden, die Sie lesen und schreiben den Wert einer Instanzvariablen eines Objekts lassen

public class AccessorExample { 
private String attribute; 

public String getAttribute() { 
return attribute; 
} 

public void setAttribute(String attribute) { 
this.attribute = attribute; 
} 
} 

Warum sie benutzen?

Getter und Setter machen APIs stabiler. Betrachten wir ein Feld öffentlich in einer Klasse, auf die andere Klassen zugreifen. Später möchten Sie zusätzliche Logik hinzufügen, während Sie die Variable abrufen und setzen. Dies wirkt sich auf den vorhandenen Client aus, der die API verwendet. Änderungen an diesem öffentlichen Feld erfordern daher Änderungen an jeder Klasse, die auf sie verweist. Im Gegensatz dazu kann man mit Zugriffsmethoden leicht einige Logik hinzufügen, wie einige Daten zwischenspeichern, sie später einfach initialisieren. Darüber hinaus kann man ein Ereignis "Eigenschaft geändert" auslösen, wenn der neue Wert vom vorherigen Wert abweicht.All dies wird für die Klasse nahtlos sein, die mit der Zugriffsmethode Wert erhält.

Auch Getters und Setter-Methoden ermöglichen verschiedene Zugriffsebenen - für z. Get kann öffentlich sein, aber das Set könnte geschützt werden.

1

Mit Getter und Setter gibt Ihnen mehr Kontrolle über die Gültigkeit Ihrer Objekte, die Möglichkeit, Testwerte geben, die auf e einstellen Sorgen Sie dafür, dass sie vernünftig sind usw. (Und natürlich, für schreibgeschützte Eigenschaften, lassen Sie den Setter einfach weg.) Auf einer modernen JVM mit einem Just-in-Time-Compiler kosten sie im Grunde nichts; wenn sie wirklich nur ein privates Datenmitglied lesen und schreiben, und wenn sie sich in einem Hotspot befinden (ein bisschen Code, der benutzt wird Los), wird der JIT sie inline.

2

Der direkte Zugriff auf die Felder führt zur Auflösung encapsulation.

öffentliche Variablen für den Zugriff darauf zu machen wird schwierig sein, den Zustand dieses Objekts zu verwalten. wo wie mit Methoden können Sie einfach den Zustand des Objekts steuern.

+1

Nun, ich bin nicht wirklich unterbesten, weil mein Englisch ist nicht zu gut, aber trotzdem danke. Also muss ich die Getter und Setter richtig benutzen? –

2

Die Verwendung von Getter und Setter anstelle von öffentlichen Membern wird als Kapselung bezeichnet und ist ein grundlegendes OOP-Konzept. Auf diese Weise können Sie die Eingabe steuern und eine gewisse Logik und Gültigkeit für Ihre Modelle beibehalten.

class Bottle { 
    public int volume = 0; 
} 

class EncapsulatedBottle { 
    private int volume = 0; 

    public void setVolume(int volume) throws Exception { 
     if (volume < 1) { 
      throw new Exception("A bottle cannot have a negative volume"); 
     } 
     this.volume = volume; 
    } 
    public int getVolume() { 
     return this.volume; 
    } 
} 

Finde den Unterschied :-)

1

Getter/Setter Verwendung ist in der Regel besser, denn:

  • können Sie (öffentlich) Zugriff auf Read-only beschränken (keine Setter)
  • Sie kann zusätzlichen Code hinzufügen, ohne die Benutzer der Eigenschaft neu kompilieren/ändern zu müssen (dh Klassen, die den Getter/Setter aufrufen)
  • entspricht der Java Bean-Spezifikation, die heißt es in einer Eigenschaft muss Getter/Setter haben - und viele Bibliotheken/Frameworks wie Java EL usw. stützen sich auf diesen Vertrag