2012-08-09 11 views
9

Mögliche Duplizieren:
Why use getters and setters?Notwendigkeit der Getter-Methoden

Dies ist ein Neuling Frage. Ist es sehr wichtig, getmethods für den Zugriff auf Eigenschaftswerte zu verwenden? Sobald der Wert zugewiesen wurde, kann das Werteverzeichnis abgerufen werden. In dem folgenden Code kann displayName() FirstName-Wert beispielsweise ohne die Hilfe einer beliebigen Getter-Methode anzeigen. Oder ist es eine Standardcodierung Standards, die man Getter-und Setter-Methode oder andere Methoden haben muss, die diesen Wert gibt?

class Test{ 

    private String firstName; 

    public void setName(String fname){ 
     firstName = fname; 
    } 

    public void displayName() { 
     System.out.println("Your name is " + firstName); 
    } 
}   

Antwort

12

Tell, Don't Ask ist ein wichtiger Grundsatz im objektorientierten Design. Im Allgemeinen sollten Sie den Objekten sagen, dass sie etwas tun sollen, anstatt ihnen Fragen zu stellen. Getters/Setter jeder, wo diese Praxis zu entmutigen, weil Sie ermutigt sind, in ein Objekt zu erreichen und auf die Felder zu gelangen (oder noch schlimmer erreichen und stochern im Falle von Setter). Dies bricht die Kapselung und macht Ihren Code schwieriger zu verstehen.

In Ihrem speziellen Fall würde ich ein Objekt namens Name erstellen, das einen Konstruktor hat, der den Namen und die einzelne Methode verwendet, um es anzuzeigen.

2

Verwenden Sie immer Getter und Setter, um auf Ihre Eigenschaften zuzugreifen!

Sie sollten bei this article...

+3

auch in Fällen von privaten Paketklassen und verschachtelten Klassen? – Eugene

+3

Gilt das auch, wenn Sie innerhalb der Klasse auf das Feld zugreifen wollen (wie in diesem Beispiel)? Ich denke nicht ... Der Artikel spricht nur über den Zugang von außen und die alternative Nutzung von öffentlichen Bereichen (denen ich zustimme, sollte auf ein Minimum beschränkt sein). – brimborium

4

in Ihrem Fall einen Blick (den Anzeigenamen angezeigt werden) ist es nicht notwendig ist Getter zu liefern.

Aber wenn Sie das Feld in einer anderen Klasse verwenden möchten, müssen wir die Getter-Methode bereitstellen.

3

Getter und Setter sind ein Teil der Standardschnittstelle für Java Beans und viele Frameworks wie Hibernate erwarten sie an ihrem Platz. Es bleibt natürlich Ihnen überlassen, ob und wann Sie sie benötigen und zu welchem ​​Zweck. Sie bieten Zugriff auf Ihre privaten Member-Variablen und sie können Ihnen sogar die Möglichkeit geben, mehr zu tun als nur einfach zu bekommen und zu setzen.

Der Punkt der OO-Software ist Wiederverwendung. Dies bedeutet, dass andere Programmierer oder Sie in Jahren den Code für andere Systeme verwenden können.

Wenn Sie private Mitgliedsvariablen haben und get/set-Funktionen verwenden, können Sie die interne Implementierung der Funktion ändern, ohne den gesamten anderen Code zu unterbrechen, der sie verwendet.

2

Mit privaten Zustand, Kapselung ist gut, und in vielen Fällen ist dies das Richtige. Angenommen, Ihre Klasse soll Thread-sicher sein, mit öffentlichen Feldern können Sie das nicht sicherstellen.

Auf der anderen Seite gibt es Fälle, in denen dies nutzlos ist! Angenommen, Sie greifen nur in einem Paket auf Ihr Objekt zu, Sie sind sicher, dass Sie es nie exportieren werden, und warum dann?

+1

ziemlich sicher, dass Sie mit dem Schlüsselwort 'volatile' können. – Woot4Moo

+2

@ Woot4Moo die einzige Sache, die Sie mit volatilen sicherstellen werden ist Sichtbarkeit, die nicht genug für Thread-Sicherheit ist – Eugene

+1

scheint dies nicht zu widersprechen: http://StackOverflow.com/Questions/7805192/is-a-volatile-int-in -java-thread-safe – Woot4Moo

2

Ich habe keine Links, um dies zu unterstützen, aber es ist was ich tue.

Ich versuche öffentliche Felder zu vermeiden, wenn sie nicht statisch sind. Also benutze ich nur geschützte und private Felder. Innerhalb der Klasse können Sie ohne get/set darauf zugreifen, das ist völlig in Ordnung. Versuchen Sie von außerhalb der Klasse, get/set zu verwenden.

So ist Ihr Beispielcode völlig in Ordnung zu mir. :)

EDIT: Eine Ausnahme ist für mich, wenn ich ein struct -ähnlichen Container-Klasse wie dieses

class Point4D { 
    public int x1, x2, x3, x4; 
} 

schaffen Dann denke ich, dass die öffentlichen Bereiche sind ok. Es wäre noch besser, sie privat zu machen und die Getter public int x1() usw. zu nennen. Sobald einige Methoden in diesem Container eingeführt werden, die den Zustand der Instanz ändern (wie die Werte von x1/x2/x3/x4 ändern), mache ich sie privat und addiere get/set.

Verwandte Themen