2009-12-15 8 views
52

Gibt es eine bessere Standardmethode zum Erstellen von Getter und Setter in Java?Java Getter und Setter

Es ist ziemlich weitschweifig zu müssen explizit Getter und Setter für jede Variable definieren. Gibt es einen besseren Ansatz für Standardannotationen?

Does Frühling haben so etwas wie das?

Sogar C# hat Eigenschaften.

+16

Es ist wahrscheinlich nicht das, was Sie hören möchten, aber die meisten IDEs können sie für Sie erzeugen. –

+0

Um den Frühlingsteil der Frage zu beantworten: Nein, nicht wirklich. Außerdem wirst du nach dem "Programmieren" von XML für ein paar Tage um die Freude bitten, ordentliche, präzise Getter und Setter wieder zu programmieren :) –

+0

Korrigiere mich, wenn ich falsch liege, aber du musst immer noch C# -Eigenschaften schreiben, oder? Es ist nicht so, als wären sie impliziert, und Sie müssen sie nur schreiben, wenn Sie das grundlegende Lese-/Schreib-zu-Variable-Verhalten erweitern möchten. Das einzige, was sie über Getter und Setter haben, ist, dass sie sie Seite an Seite hält. – David

Antwort

18

Eclipse verfügt über eine Kontextmenüoption, die diese automatisch für Sie generiert, da viele andere IDEs sicher sind.

+1

Wenn du mich abstimmen willst, gib wenigstens einen Grund dafür. – Ascalonian

+2

Nicht wirklich die beste Lösung, aber wir beschränken uns darauf. – WhyNotHugo

+2

jedes Mal, wenn ich eine Änderung an etwas mit einer Reihe von Feldern mache, lösche ich nur die Getter und Setter und habe sie alle regenerieren. Es ist Lärm. – gtrak

3

Die meisten IDEs bieten eine Abkürzung für den Code zu erzeugen (z Eclipse-: Rechtsklick -> Quelle -> Generate Getters & Setters), obwohl ich weiß, dies ist wahrscheinlich nicht die Antwort, die Sie suchen.

Einige IOC-Frameworks ermöglichen es Ihnen, Eigenschaften zu kommentieren, so dass sie im Kontext des Frameworks verwendet werden können, z. Tapestry IOC, und die neuesten Frühjahr, denke ich (aber diese Verwendung ist limited, um durch das Framework zu verwenden)

1

Ja, Sie sind irgendwie kein Glück. Groovy erstellt sie für Sie, aber keine Würfel in Standard-Java. Wenn Sie Eclipse verwenden, können Sie generate them pretty easily, sowie HashCode() und Equals() Funktionen generieren.

58

Ich bin mir nicht sicher, ob Sie es als "Standard" betrachten, aber Project Lombok behebt dieses Problem. Sie verwenden Anmerkungen, um einen Großteil der Ausführlichkeit von Java zu ersetzen.

Manche Menschen suchen nach alternativen Java Geschwister Sprachen wie Groovy oder Scala. Ich fürchte, es wird - wenn überhaupt - einige Jahre dauern, bis der JSR einen "standardisierten" Weg findet, um dies in Java richtig zu "reparieren". Hier

+8

+1: Lombok ist eine nette Ergänzung und kann auch auf hashCode, equals & toString aufpassen. Einen Blick wert für dumme Datenklassen. – Tim

+2

+1 auf Lombok als sehr cool, aber -1 für im Wesentlichen IDE-spezifisch. Jede andere IDE und Sie erhalten eine Menge von Fehlern, die den Code verzieren, da die IDE nicht weiß, was vor sich geht. Ich bin mir auch nicht ganz sicher, wie es mit Debuggern funktioniert. –

+1

Es funktioniert auch gut mit Maven, und sie haben gerade eine De-Lombok-Option hinzugefügt, die Quellcode ohne Bezug auf Lombok generiert. – Tim

3

ist ein interessanter Artikel über das Thema: http://cafe.elharo.com/java/why-java-doesnt-need-properties-it-already-has-them/

denke ich, Eigenschaften eine Verknüpfung sind, aber es ist mehr ein kleines Feature als ein echtes wichtiges Merkmal

+1

Ich habe ein paar Jahre in Delphi verbracht. Ich habe Eigenschaften immer als eine der besten Eigenschaften von Delphi betrachtet. Ich war immer irgendwie traurig, dass Java diese Funktion nicht hat. Anders Hejlsberg baute Eigenschaften in C# und jetzt haben die MS-Leute sie und wir nicht. Es mag ein "kleines" Feature sein, aber alles, was Code reduziert, reduziert Fehler und erhöht die Verständlichkeit. –

+1

Jerome - ich stimme nicht zu. Die Bindung in Java ist derzeit b/c der Mangel an Unterstützung verkrüppelt. Stellen Sie sich vor, Sie könnten das statische .class-Element nicht erhalten, sondern stattdessen mit Strings umgehen. Ich sehe immer wieder, dass Leute schreiben, dass Eigenschaften in der Sprache nur syntaktischer Zucker sind, aber das ist einfach nicht so. –

2

mit Netbeans, starten Sie einfach erhalten eingeben oder einstellen, wo Der Getter/Setter soll ersetzt werden und Auto-Vervollständigen (Strg + Leertaste) aufrufen, es gibt Ihnen die Möglichkeit, den Getter oder Setter zu erzeugen. Es gibt Ihnen auch eine Option, um einen Konstruktor zu generieren.

+0

Eclipse hat auch etwas ähnliches. –

+0

Und so ist IntelliJ IDEA. Das macht 3 große Java-IDEs, die Sie verwenden können, um das Problem zu umgehen. –

1

Es gibt keinen besseren Weg, den Teil der Sprache ist - nichts wie ein „Objekt“ Stichwort.

Eine Alternative, wie andere Leute schon erwähnt haben, ist Ihre IDE zu verwenden, um sie zu erzeugen. Ein anderer, wenn Sie viel von Objekten haben, die dies benötigen, ist, Ihr eigenes Codegenerierungswerkzeug zu schreiben, das eine Basisklasse annimmt und einen Wrapper mit Gettern und Setter erzeugt.

könnten Sie belichten auch einfach die Variablen als öffentliche Mitglieder. Auf der anderen Seite werden Sie wahrscheinlich zurückkommen, wenn Sie sich entscheiden, eine Validierungslogik hinzuzufügen.

Ein letzter Gedanke: Wenn Ihre Klassen nicht einfach zum Übertragen von Daten verwendet werden, sollten sie ihren internen Status wahrscheinlich nicht offen legen. IMO, "Verhalten" -Klassen mit Gettern und Setter sind ein Code-Geruch.

2

Als eine mögliche Alternative, haben Sie versucht Scala?Es kompiliert zu Java Bytecode und hat viele interessante Abkürzungen, die Ihr Leben als Java-Programmierer einfacher machen können.

Eigenschaften zum Beispiel:

case class Person(var name:String, 
        var age:Int); 
val p = Person("John", 4) 
p.name 
p.name = "Charlie" 
p.name 

Und die Ausgabe:

defined class Person 
p: Person = Person(John,4) 
res7: String = John 
res8: String = Charlie 
+1

Änderung der Technologie. – Sylar

+0

Technisch Java ist eine Teilmenge von Scala, daher könnte das Problem wahrscheinlich mit diesem Ansatz gelöst werden. –

+4

Ich bin bei dir in Scala (und habe dich deshalb wieder auf 0 gesetzt), aber "hast du Scala ausprobiert?" fragt ein bisschen viel. Scala hat eine gewisse Ähnlichkeit mit Java, aber die Unterschiede sind so groß, dass ich eine Weile versucht habe, "Java in Scala zu programmieren" und aufgegeben habe. Während es eine Freude ist, die Getter/Setter zu verlieren, erfordert Scala eine solide Verpflichtung. –

0

, dass die Arbeit der IDE ist, um sich wiederholende ausführliche Code als Getter/Setter

+3

Ich bin nicht uneins, aber ich denke, es ist ein Zeichen für eine Schwäche in der Sprache, wenn Code-Generierung erforderlich ist, um sich wiederholende Aufgaben zu erfüllen. Wenn die IDE intelligent genug ist, um es für Sie zu tun, sollte die Sprache auch sein! –

+0

Die IDE ist nicht intelligent genug, um es zu tun, es erzeugt den Code genau dann, wenn Sie sich dafür entscheiden, Getter und/oder Setter bereitzustellen, und nur für die gewünschten Instanzvariablen. Standardmäßig sind alle Variablen nicht lesbar/änderbar, wenn sie nicht als öffentlich deklariert werden. Über Ausführlichkeit bietet Java mehr als einfaches Lesen/Modifizieren dieser Variablen, könnte aber einige Logik ausführen, bevor Sie einen Wert ändern oder zurückgeben, der Variablen entspricht, wiederum nur, wenn Sie sich dazu entscheiden. – user225486

+0

An dieser Stelle widersprechen Sie Ihrer eigenen Antwort. Sie sagen, dass es die Arbeit des Benutzers ist, der IDE zu sagen, dass sie den wiederholten ausführlichen Code erzeugen soll. Klar, genau so funktioniert es und ich finde es sehr hässlich. Mit Delphi, Ruby und anderen Sprachen können Sie einfache Schlüsselwörter verwenden, um einfache Getter und Setter automatisch zu generieren, während Sie * noch * die Freiheit haben, Tests, Nebeneffekte, Abstraktionen oder etwas anderes hinzuzufügen, wenn Sie möchten. –

0

Verwenden Sie Ihre IDE zu erzeugen zu generieren es für Sie und versuchen Sie, die Menge der Getter/Setter zu minimieren, die Sie haben - Sie werden wahrscheinlich den zusätzlichen Vorteil der Unveränderlichkeit genießen.

ich die C# Syntax für Eigenschaften wie, ich glaube, es ist schön und sauber, und ziemlich sauber.

0

Nun, eine Option ist nicht so Angst vor öffentlichen Feldern. Für einfache Klassen, von denen Sie wissen, dass sie Validierungen oder Extra-Arbeiten unter der Haube beim Abrufen und Setzen nicht durchführen, benötigen öffentliche Felder weniger Vortex, sind syntaktisch netter und effizienter.

+1

Sie sind nicht effizienter, da Hotspot Inline-Getter und Setter kennt – gtrak

6

Ich habe einige Anmerkungen erstellt, die nicht Eclipse-spezifisch sind.

Siehe http://code.google.com/p/javadude/wiki/Annotations

Zum Beispiel:

package sample; 

import com.javadude.annotation.Bean; 
import com.javadude.annotation.Property; 
import com.javadude.annotation.PropertyKind; 

@Bean(properties={ 
    @Property(name="name"), 
    @Property(name="phone", bound=true), 
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST) 
}) 
public class Person extends PersonGen { 
} 

Meine Anmerkungen eine übergeordnete Klasse erzeugen; Ich denke, Lombok ändert die tatsächlich kompilierte Klasse (die offiziell nicht von Sun unterstützt wird und könnte brechen - ich könnte falsch sein, wie es funktioniert, aber basierend auf dem, was ich gesehen habe, müssen sie das tun)

Genießen Sie! - Scott

0

Wenn Sie Emacs verwenden, könnte es möglich sein, ein Emacs-Makro zu definieren, das dies für Sie erledigt. Irgendwelche Emacs-Gurus da draußen? :)

3

Ich stimme zu, dass Getter/Setter sind ausführlich. Project Lombok hat eine gute Antwort dafür, wie von anderen vorgeschlagen. Andernfalls könnten Sie die IDE-Fähigkeit verwenden, um sie zu generieren.

2

Es gibt auch Frühling Roo Projekt mit seiner @RooJavaBean Anmerkung. Es hat auch @RooToString und @RooHashCodeEquals oder so ähnlich. Es erzeugt im Hintergrund eine AspectJ-Datei mit geeigneten Methoden.